Qt实现 自定义标题栏并支持界面放大缩小、移动

Qt C++自定义窗体,实现自定义标题栏、阴影、全局背景、拖拽、缩放、最大化等功能,附下载链接 功能:自定义标题栏、阴影、透明、边框、全局背景、拖拽、缩放、最大化、最小化、还原、关闭、记住窗体状态。 网上已经有很多类似的教程,但都有一些不足。本篇文章几乎完全实现了和window默认窗体的所有功能(缺少最小化的动画和分屏)。 我是业余的,水平不高,这是我能想到最完美的解决方案了。 阅读详情

自定义标题栏有很多好处,比如重绘放大、缩小、关闭样式,进行灵活的图标贴图,实现我们想要的效果,

首先重写mouseMoveEvent和mouseReleaseEvent事件,以及事件过滤器。

public:
//鼠标移动事件
void mouseMoveEvent(QMouseEvent *event);
//鼠标释放事件
void mouseReleaseEvent(QMouseEvent *event);
//事件过滤器
bool eventFilter(QObject *obj,QEvent *event);
//改变窗口大小
void turnView();

private:
//鼠标相对窗体的位置
QPoint m_pos;
//是否按下
bool m_bPressed;
//是否最大化
bool m_bMaxView;
//最大尺寸和上一次的尺寸
QRect m_maxRect,m_norRect;

然后在构造函数中为控件注册事件过滤器。并初始化变量。

m_bPressed = false;
m_bMaxView = false;
//注册自定义标题栏
ui->groupBox->installEventFilter(this);
//注册窗口自身
this->installEventFilter(this);
//获取电脑屏幕尺寸
m_maxRect = QApplication::desktop()->avaliableGeometry();

接下来实现重写的鼠标事件

void MainView::mouseMoveEvent(QMouseEvent *event)
{
    if(m_bPressed){
        if(m_bMaxView){
          //缩小到原先界面大小 
          setGeometry(m_maxRect.x(),m_maxRect.y(),m_norRect.width(),m_norRect.height());
          m_bMaxView = false;
        }
    }
 
    //鼠标相对电脑屏幕的位置,左上角为原点
    QPoint movePos = event->globalPos();
    QPoint pt(movePos - m_pos);
    
    //移动主窗体位置
    move(pt);
}
 
void MainView::mouseReleaseEvent(QMouseEvent *event)
{
    m_bPressed = false;
    event->ignore();
}

eventFilter 过滤事件

bool MainView::eventFilter(QObject *obj,QEvent *event)
{
    QMouseEvent * mouseEvent = static<QMouseEvent *>(event);
    if(obj == ui->groupBox){
        if(event->type() == QEvent::MouseButtonDbclick && mouseEvent->button() == Qt::LeftButton){
            turnView();
            return false;
        }
    }
    else if(obj == this){
        if(event->type() == QEvent::MouseButtonPress && mouseEvent->button() == Qt::LeftButton){
            m_bPressed = true;
            m_pos = mouseEvent->pos;
        
            return false;        
        }
    }

    return QObject::eventFilter(obj,event);
}
​

turnView 界面最大化和恢复正常

void MainView::turnView()
{
    if(m_bMaxView){
        setGeometry(m_norRect);    //设置为上一次大小
        m_bMaxView = false;
        return;
    }
    
    m_norRect = geometry();    //记录当前大小
    move(0,0);
    setGeometry(m_maxRect);    //最大化
    m_bMaxView = true;
}

 

Qt无边框窗体-最大化时支持拖拽还原 用Qt进行开发界面时,既想要实现友好的用户交互又想界面漂亮,那么自定义界面就必不可少。其中有一个操作就是是我们每一个Qter开发者都要会的,而且是经常进行的。Qt::FramelessWindowHint这个属性想必大家都使用过,有些同学可能对这个属性很了解,也用的是炉火纯青,今天我们也来说说这个属性。关于这个无边框属性网上也有一些文章,有些谈论的是bug,当然了这是针对不同os而言,也有些是跟其他第三方库混合使用时的问题。可是问题归问题,想要实现自定义的优秀界面这个属性也是必不可少的。 阅读详情

相关推荐

自定义无边框窗口和标题栏的可拉伸和拖动功能 - Qt5/通用 - Windows和Linux

在Qt Creator中,选择"新建项目",然后选择"Qt Widgets应用程序"。在"类信息"页面上,将类名设置为"CustomWindow"并选择"窗口类",然后单击"下一步"。在"项目配置"页面上,保留默认设置,然后单击"完成"。在本文中,我们将探讨如何使用Qt5创建一个无边框窗口,并为其添加自定义的标题栏。现在,我们需要创建一个自定义的窗口类,该类将扩展Qt的QWidget类,并处理窗口的外观和行为。在上面的代码中,我们创建了一个CustomWindow类的实例,并将其设置为主窗口的中心部件。

TechRoarX的博客 548

Qt UI设计之《自定义标题栏可移动拖拽窗口》

该窗口自定义标题栏,窗口可移动,可伸缩,使用的是系统自带隐形边框 窗口分为三个控件:主窗口QMainWindows,标题栏QWidget,客户端QWidget 1 标题栏相关代码 #pragma once #include <QWidget> class uititlebar : public QWidget { Q_OBJECT public: uititlebar(QWidget *parent = Q_NULLPTR); ~uititlebar(); protected: v

qq_27096221的博客 4884

Qt 之 自定义窗口标题栏 之 窗口拉伸

一、简述之前写了一篇 Qt 之 自定义窗口标题栏 ,用重写了窗口的标题栏,今天为此篇的续篇,对自定义窗口再进行拓展,因为进行了自定义窗口标题栏,去掉了窗口原有的边框,所以鼠标放置窗口边框对窗口进行拉伸的功能也就没有了,所以需要自己实现。其实窗口拉伸功能在 Qt 之 简单截图功能(三)实现可拖拽选中区域 文章中已经有类似的实现,但也有一些差别,下面就窗口拉伸功能进行讲述。注意:在阅读此篇文章前可以先阅

前行之路还需前行 9251

Qt自定义标题栏(可移动,可伸缩)

我之前写了自定义标题栏已经实现可移动,可伸缩窗口了,但是往窗口里面添加控件在窗口边缘时重叠时没有改变光标,导致不能伸缩窗口,现在我终于解决了这个问题! gitee地址:https://gitee.com/Is_the_flower_still_in_bloom/Qt //AllWidget.h #ifndef ALLWIDGET_H #define ALLWIDGET_H #include <QWidget> QT_BEGIN_NAMESPACE ...

qq_50052051的博客 796

QT 自定义无边框窗体,支持边缘拖拽缩放

QT 自定义无边框窗体,支持边缘拖拽缩放。搬运自http://www.cnblogs.com/xufeiyang/p/3313104.html,稍改了些代码,供参考

CentOS7无外网环境下MySQL8.0完整离线部署指南

本文详细介绍了在CentOS7无外网环境下,如何通过MySQL8.0二进制包进行完整离线部署。指南涵盖了从环境准备、依赖安装、用户与目录创建,到数据库初始化、服务配置及远程访问设置的全过程,并提供了关键的避坑技巧,帮助企业运维人员在内网环境中高效、稳定地搭建MySQL数据库服务。

xxx12的博客 1029

Qt自定义标题栏

Qt自定义标题栏效果图源码使用方法实现思路及部分代码参考 效果图 1.设置为无边框窗口后拉伸、移动、放大缩小等事件需要自己重新实现,我只实现标题栏拖动、双击放大/还原、窗体边缘可拉伸等基本功能,有其他需求的小伙伴可参考和修改源码 2.拉伸右、下、右下这三个方向不会抖动,拉伸其他方向均会抖动,貌似很多自定义窗口的软件都是这样,包括微软的Edge浏览器、QQ、网易云音乐等 3.事件实现看过很多别人的方法,思路都是差不多的,但仅实现放大、缩小、移动、拉伸的话,很多人的代码都写得过于复杂,不便于我这种菜鸡阅读和理

weixin_45898639的博客 4453

Bybit面经

这段总结描述了求职者在Bybit面试过程中的经历和相关问题,包括面试内容、求职者向面试官提问的问题以及关于Bybit的信息

郑泽洲的博客 2580

Qt 自定义窗口标题栏

为什么要自定义标题栏?左边的是 window 自带的标题栏,他无法跟随这自己的 Qt 主题变化而变化(除非使用对应系统的API进行修改)右边是取消了系统自带的标题栏的状态(你还是看到一个标题栏,那是我通过 Qt 自己实现的),是不是美观多了!但这会带来其他的问题,系统的标题栏可以提供窗口的拖动、缩小、放大等基本交互功能,取消掉了标题栏也就无法享受这一部分便利所以在 Qt 实现自定义标题栏不止要实现基本的按键,还要实现窗口的基本交互功能。

kmalloc.的博客 1194

LCD、LED、OLED、Mini LED、Micro LED、全阵列LED、QLED、QD-OLED、QNED、AMOLED是什么意思?

LCD(液晶显示器,Liquid Crystal Display)定义:LCD 是一种利用液晶材料控制光线通过的显示技术,需依靠背光源(如冷阴极荧光灯 CCFL 或 LED)照亮液晶层以形成图像。技术原理:液晶分子在电场作用下改变排列,控制背光通过的强度和颜色。液晶本身不发光,需外部光源。特点:结构包括背光层、液晶层、彩色滤光片和偏光片。响应时间较慢,黑色表现因背光漏光而偏灰。LED(发光二极管显示,Light Emitting Diode)定义。

中国最威武的城市!武功军威-武威,铁骨铮铮! 3423

HttpClient跳过HTTPS证书验证的3种实战方法(含完整代码示例)

本文详细介绍了HttpClient跳过HTTPS证书验证的3种实战方法,包括自定义TrustManager、SSLContext配置和HttpClientBuilder高级定制,并提供完整代码示例。这些方法适用于开发和测试环境,帮助开发者快速解决自签名证书或未认证证书导致的HTTPS请求失败问题,但需注意生产环境的安全风险。

weixin_29213655的博客 529

Qt Dialog捕捉鼠标移动事件

最近做的项目中,由于重写界面标题栏,需要自己实现鼠标拖动界面放大缩小的功能,所以就需要捕获鼠标移动事件。 在网上查了一些资料,很多都说通过setMouseTracking(true);的方式开启鼠标跟踪,并且把所有子控件的该状态也打开。但是效果并不好。 最终找到一个方法,在构造时调用以下代码。 //使用此方法开启鼠标移动事件不会被子控件覆盖 setAttribute(Qt::WA_Hover,...

weixin_30387423的博客 981

企业第三方应用开发概述_测试第三方应用对接企业_以及如何使用流程_Demo演示---企业微信开发002

那么第三方公司开发了应用,做为服务提供商,如果,一个企业想使用这个应用,我开发的这个应用的话,那么。其实就是给我们的应用,安装一个,使用他的企业,分配一共企业 允许这个企业使用我们的应用的功能,可以看到其实就是多了运营规范,因为,第三方应用,其实就相当于,是第三方公司开发的,程序,首先来看一下。然后再来看,这里我们选择这个公司,其实可以,选择到具体的,部门,或者是。然后我们使用一个企业的管理员账号进行,扫码,来授权,这个应用,可以。其实就是指定,我这个企业中,哪个部门,或者哪些员工,可以使用。

添柴程序猿的专栏 412

Qt 自定义通用标题栏TitleBar类

【代码】Qt 自定义通用标题栏TitleBar类。

庄生晓梦 865

scp 出现Permission denied错误 解决方法

第一种说辞(来源于网络),说是scp涉及root远程登录,默认是没有打开的,只需要把配置文件中的permit打开即可。最后scp的时候发现还不行,只需要将其scp的服务器用户名 修改为root即可。第二种解决方案,将scp 传输的服务器用户名改为root即可。(这是最基本的,一开始我忽视了这个问题,导致一直scp不了)window系统下,向ubuntu操作系统 scp传输文件。

码农研究僧的博客 6727

LeRobot 入门教程(七)数据集

LeRobot Dataset v3.0 是机器人学习数据的标准化格式,支持多模态时间序列数据和视频的统一访问。该版本通过基于文件的存储(Parquet/MP4)、关联元数据和Hub原生流式处理等新特性,显著提升了性能并降低了存储开销。文档详细介绍了格式设计、安装使用、数据记录与加载方法,以及从v2.1迁移到v3.0的步骤,特别针对大型数据集(如DROID 1.0.1)的处理提供了SLURM集群移植方案。v3.0通过优化文件组织和元数据管理,实现了更快的加载速度、更高的内存效率和更好的可扩展性。

2506_90492529的博客 2052

QT 自定义简单标题栏

系统自带的标题栏不知道怎么给它设置样式,所以自己写一个吧,将就用

qq_36500197的博客 1283

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Qt无标题栏窗口的平移,缩放,拉伸

实现功能 在做Qt应用的时候,由于美观等问题经常会使用自定义的标题栏并将窗口默认的标题栏进行隐藏。随之带来的问题就是窗口失去了平移,缩放等功能。本文根据拦截自定义标题栏widget的事件,实现了通过移动标题栏进而移动整个窗口window,并且支持双击标题栏缩放整个窗口以及窗口边缘的拉伸功能。本文主要参考了Qt 之自定义界面(窗体缩放-跨平台终极版),在其基础上进行一些修改和整理。 UI结构如下 ...

急支糖浆的博客 2254

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

QT自定义窗口标题栏(自定义最大化和还原功能,无边框无布局,附带标题栏拖动和双击效果)

网上找了很多资料,但是都没有想要的,基本上都是要布局,然后用this->showFullScreen。但是我已经做了很多控件,现在再来布局根本不太现实,并且布局后的位置不可以设置到自己想要的位置。 然后我参照了一些别人写的resize的,但别人是有边框的,然后重写resizeEvent。另外就是字体大小无法更改。今天,我做的这个就完全是不需要布局,不需要重写resizeEvent函数,可以更改字体大小。 1.先设置窗口无边框,设置无边框会隐藏掉QT窗口自带的标题栏 2.在ui界面拖出一个.

LtinF的博客 4553

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Qt中自定义标题栏(C++)(附源码)

Qt中自定义标题栏(C++)附源码

he1234519的博客 607

Qt下的Ribbon控件——SARibbon

#[TOC] 简介 这是Qt下一个轻量级的Ribbon控件(Office样式UI),界面截图: 实际使用到自己写的一个开源软件中效果: MIT协议,欢迎大家使用并提出意见 gitee(码云) - https://gitee.com/czyt1988/SARibbon github - https://github.com/czyt1988/SARibbon 编译方法 使用Qt Creator直接打开SARibbonBar.pro,并编译即可,会编译出SARibbonBar库和一个(目前只有一个例子)例子

尘中远的程序开发记录 1万+

QT自绘标题和边框

1) 在创建窗口前设置Qt::FramelessWindowHint标志,设置该标志后会创建一个无标题、无边框的窗口。   2)在客户区域的顶部创建一个自绘标题栏。   3)给窗口绘制一个背景作为边框。   4)如果想要鼠标拖动效果,可以在WM_NCHITTEST消息中返回HTCAPTION,具体方法百度这里不再详述。

QtCompany的博客 4426
上一篇: Qt实现 模态对话框以及窗口置顶
下一篇: c++11使用线程
Qt上位机开发
Qt上位机开发 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄9年 9664粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值