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.实现截图: