QT自定义MainWindow

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

发布了72 篇原创文章 · 获赞 32 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/xx18030637774/article/details/104576742