qt创建自定义标题栏

来源:互联网 发布:楼市泡沫 知乎 编辑:程序博客网 时间:2024/05/17 20:35

问题描述:利用QT自带的QDialog或QMainwindow创建的窗口,这些窗口的标题栏都有固定的形式,较难修改。


我们希望创建自定义形式的标题栏,实现修改背景图片图标、在特定地方加上按钮等功能。


实现方法:创建QWidget,在QWidget上实现自定义标题栏的样式,在其上实现鼠标拖动事件(Qt重新实现QMouseEvent实现自定义窗口可拖动);将主窗口修改为QFrameLess形式(即没有标题栏的形式),用QVLayout将这个标题栏widget加入到主窗口的布局中。


具体实现:

(1)创建继承QWidget的界面titlebar,可以将它设计为任何形式的自定义标题栏。


(2)在主窗口程序mainwindow.cpp中设置窗口为FramelessWindowHint形式,即没有标题栏的形式;在通过QVBoxLayout将标题栏和mainwindow中的其他部件拼接到一起;在maiwindow类中通过重新实现QMouseEvent实现主窗口的可拖动(鼠标事件的实现参考:Qt重新实现QMouseEvent实现自定义窗口可拖动)。

MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent){    this->setWindowFlags(Qt::FramelessWindowHint);    QWidget *wd = new QWidget(this);    QVBoxLayout *layout_all = new QVBoxLayout;    layout_all->setContentsMargins(0,0,0,0);    layout_all->setSpacing(0);...    layout_all->addWidget(title);    layout_all->addWidget(tabWidget);...    wd->setLayout(layout_all);    this->setCentralWidget(wd);}

(3)另外需要注意的是:自定义标题栏中左上角通常都有  最大化、最小化和关闭按钮。 这些按钮需要在创建titlebar界面类时自己创建,并且用QT的信号槽机制,使用connect函数,将他们的clicked信号连接到mainwindow的showMaximized()、showMinimized()和close()槽函数。





原创粉丝点击