qt创建自定义标题栏

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


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


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


具体实现:

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

qt创建自定义标题栏_第1张图片

(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()槽函数。





你可能感兴趣的:(qt创建自定义标题栏)