1.开发环境:Qt 4.7.3 + MinGW 32bit (MSVC2015 32bit)

2.实现大纲:

1)自定义边框,标题栏,工具栏,内容栏,状态栏(后面三个代码中没有实现实现)

2)重写鼠标事件来控制可以自由移动框体

3)样式文件使用qss实现,UI设计/数据/控制分离,方便二次开发

3.具体实现:

1)通常情况下,linux或者window系统下的QMainwindow的边框样式比较原始不太美观,Qt提供了可以舍弃原有的边框,然后自定义。具体设置参数如下:

    setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint);   //配置边框属性,无边框
    setAttribute(Qt::WA_TranslucentBackground);    //设置背景半透明    

2)关于框体中框线的样式设计,可以采用添加QFrame组件,通过设计QFrame的border相关属性来设置边框线,但是在设计的过程中发现,如果直接添加在mainwindow中添加QFrame组件,然后再设置border属性,发现border属性无效。解决方案可以在QMainwindow和QFrame之间添加一个QWidget作为“画布”,来显示QFrame的边框样式。

3)一般来说,window的标题栏一般包括图标,标题大纲,隐藏/放大/还原/关闭等组件,因此可以添加一个QFrame + QHBoxLayout来配合实现,另外按钮推荐使用QToolButton(使用QPushButton也可以,但是需要设置setAutoDefault为false,否则会在设计Dialog弹框事埋下隐藏的bug,即关于enter按键的响应问题),并且设置其hover属性和tooltip(悬放时提示按钮功能)等属性。

4)接下来需要重新定义鼠标的事件来实现鼠标拖拽mainwindow功能,主要是关于系统的四个函数的复写,通过坐标的决定坐标globalPos()和相对坐标pos()直接的变换来记录移动的距离,从而实现窗体的移动,具体如下:

    void mouseReleaseEvent(QMouseEvent *event);   //鼠标左键释放
    void mouseMoveEvent(QMouseEvent *event);      //鼠标左键一直按着,系统提供了event->buttons()来专门判断是否按着
    void mousePressEvent(QMouseEvent *event);             //鼠标左键按下, 且按下的坐标在标题栏上
    void mouseDoubleClickEvent(QMouseEvent *event);      //双击事件也就是完成标题栏上的放大按钮的相关功能

4.具体代码见下载地址:https://download.csdn.net/my/uploads

5.实现截图:

QT自定义MainWindow相关推荐

  1. Qt 自定义信号与槽

    注 对象与槽理解 //第一个参数lineEdit是激发事件对象,信号中的方法必须在对象中存在,并在对象类头文件signals下定义,//第二个参数信号,//第三个参数this是槽方法所属类的对象,且必 ...

  2. QT自定义饼图的外观

    QT自定义饼图的外观 项目简介 项目技术 项目展示 主要源码片段解析 获取完整项目源码传送门 项目简介 自定义饼图的外观. 项目技术 qt5.12,qt charts模块,C++ 项目展示

  3. QT自定义图表上不同元素的外观

    QT自定义图表上不同元素的外观 项目简介 项目技术 项目展示 主要源码片段解析 获取完整项目源码传送门 项目简介 自定义图表上不同元素的外观. 项目技术 qt5.12,qt charts模块,C++ ...

  4. 【Qt】MainWindow窗口状态栏

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 显示菜单动作状态 04. 显示临时信息 05. 显示正常信息 06. 显示永久信息 07. 附录 01. 概述 在程序主窗 ...

  5. Qt 自定义标题栏,最小化、最大化、关闭窗口,双击最大化,鼠标拖动等效果实现

    文章目录 前言 效果 代码 .pro文件 widget.h widget.cpp widget.ui title.h title.cpp title.ui 前言 本次实验内容为Qt自定义标题栏,最小化 ...

  6. QT 自定义加载等待(Loading)提示框

    QT自定义加载等待提示框 一.效果展示 二.源代码 #ifndef LOADINGDIALOG_H #define LOADINGDIALOG_H #include <QMovie> #i ...

  7. QT自定义Widget控件及其使用

    今天来给大家分享一下QT自定义widget控件及其使用,当ui设计器提供的界面不满足实际需求时,可以从QWidget继承自定义的界面组件.有两种方法一种是提升法,另一种是ui设计器自定义界面组件wid ...

  8. QT 自定义分页控件

    Qt 自定义页码控件 一.效果展示 二.头文件 #ifndef PAGECONTROL_H #define PAGECONTROL_H #include <QList> #include ...

  9. QT自定义精美换肤界面

    QT自定义精美换肤界面 陆陆续续用QT开发过很多项目,也用QT写过不少私活项目,也写过N个工具,一直梦寐以求能像VC一样可以很方便的有个自定义的界面,QSS的强大让我看到了很好的希望,辗转百度谷歌无数 ...

最新文章

  1. 装有linux的硬盘装到不同主机,把ubuntu系统安装进移动硬盘,可在不同电脑上运行...
  2. DynamicList
  3. XCTF-Reverse:re1
  4. 为什么说Android才是游戏开发者的乐土?
  5. Difference between a normal BSP application and a WebClient UI component
  6. 请求时才延迟加载JavaScript文件 - 优化篇
  7. 104种***清除方法
  8. Windows as a Service(3)——使用SCCM管理Windows10更新
  9. 沙盘erp模拟人机对抗如何将公司经营6年
  10. java计算机毕业设计宠物店管理系统源码+数据库+系统+lw文档+部署
  11. python seek_关于python:seek()函数?
  12. python程序员面试自我介绍_程序员面试要准备哪些方面的内容?
  13. 你的面子到底值几斤几两
  14. 原生js实现放大镜效果
  15. Address Sanitizer 用法
  16. 电商产品展示,选360°全景还是3D展示?
  17. AXI USB 2.0设备IP Core指导手册(第一章)
  18. RuntimeError: Default process group has not been initialized, please make sure to call init_process_
  19. 自动挂机打码赚钱是真的么?一美女自述骗局内幕
  20. 软件工程是不是教不怎么会的写程序的人开发软件?

热门文章

  1. 机器学习中为什么使用one-hot编码
  2. [折半搜索][has] Jzoj P4250 路径
  3. apache服务器配置Net的实践
  4. python 编码问题之终极解决
  5. iOS GorupBy
  6. C#--序列化与反序列化
  7. GridView 利用AspNetPager 分页时的自动编号
  8. 12面魔方公式图解法_三阶魔方入门
  9. java 服务器读取客户端文件,java 服务器读取客户端文件
  10. 继续说invoke伪指令