QMainWindow界面添加标题栏
生活随笔
收集整理的這篇文章主要介紹了
QMainWindow界面添加标题栏
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
通俗來講,添加標(biāo)題欄相當(dāng)于添加一個(gè)控件
首先可以創(chuàng)建一個(gè)標(biāo)題欄控件;
然后再創(chuàng)建一個(gè)widget,把MainWindow和標(biāo)題欄控件通過布局加進(jìn)去。
參考:Qt 之 自定義窗口標(biāo)題欄
Qt自定義標(biāo)題欄
標(biāo)題欄控件:
TitleBar.h
TitleBar.cpp
#include "titlebar.h" #include <QHBoxLayout> #include <QEvent> #include <QMouseEvent> #include <QApplication>#include <qt_windows.h> #include <QPainter>#include <QDebug> TitleBar::TitleBar(QWidget *parent) :QWidget(parent) {TiBar_pIconLabel = new QLabel;TiBar_pTitleLabel = new QLabel;TiBar_pMinimizeBtn = new QPushButton;TiBar_pMaximizeBtn = new QPushButton;TiBar_pCloseBtn = new QPushButton;TiBar_pIconLabel->setFixedSize(32, 32); //設(shè)置圖標(biāo)固定大小TiBar_pIconLabel->setScaledContents(true); //設(shè)置圖片顯示合適大小TiBar_pTitleLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);//此屬性保存窗口小部件的默認(rèn)布局行為。TiBar_pMinimizeBtn->setFixedSize(32, 32);//設(shè)置三個(gè)按鈕的固定大小TiBar_pMaximizeBtn->setFixedSize(32, 32);TiBar_pCloseBtn->setFixedSize(32, 32);TiBar_pTitleLabel->setFixedHeight(32);TiBar_pMinimizeBtn->setIcon(QIcon(":/image/image/small.ico"));TiBar_pMinimizeBtn->setIconSize(TiBar_pMinimizeBtn->size());TiBar_pMaximizeBtn->setIcon(QIcon(":/image/image/max.ico"));TiBar_pMaximizeBtn->setIconSize(TiBar_pMinimizeBtn->size());TiBar_pCloseBtn->setIcon(QIcon(":/image/image/close.ico"));TiBar_pCloseBtn->setIconSize(TiBar_pMinimizeBtn->size());QPixmap icon(":/image/image/lk.ico");TiBar_pIconLabel->setPixmap(icon);//TiBar_pIconLabel->resize(icon.width(),icon.height());TiBar_pTitleLabel->setObjectName("whiteLabel"); //此屬性保存此對象的名稱。TiBar_pMinimizeBtn->setObjectName("minimizeButton");TiBar_pMaximizeBtn->setObjectName("maximizeButton");TiBar_pCloseBtn->setObjectName("closeButton");TiBar_pMinimizeBtn->setToolTip("最小化"); //鼠標(biāo)停留在上面的提示TiBar_pMaximizeBtn->setToolTip("放大/縮小");TiBar_pCloseBtn->setToolTip("關(guān)閉");QHBoxLayout *pLayout = new QHBoxLayout(this);pLayout->addWidget(TiBar_pIconLabel);//pLayout->addSpacing(5);pLayout->addWidget(TiBar_pTitleLabel);pLayout->addWidget(TiBar_pMinimizeBtn);pLayout->addWidget(TiBar_pMaximizeBtn);pLayout->addWidget(TiBar_pCloseBtn);pLayout->setSpacing(0);//設(shè)置控件之間的間距pLayout->setContentsMargins(0, 0, 0, 0);//設(shè)置左上右下的邊距this->setLayout(pLayout);connect(TiBar_pMinimizeBtn,SIGNAL(clicked()),this,SLOT(on_TiBar_Clicked()));connect(TiBar_pMaximizeBtn,SIGNAL(clicked()),this,SLOT(on_TiBar_Clicked()));connect(TiBar_pCloseBtn,SIGNAL(clicked()),this,SLOT(on_TiBar_Clicked())); } /* 標(biāo)題欄右上角三個(gè)按鈕的槽函數(shù)*/ void TitleBar::on_TiBar_Clicked() {QPushButton *pBtn = qobject_cast<QPushButton *>(sender());//如果在由信號激活的槽中調(diào)用,則返回指向發(fā)送信號的對象的指針; 否則它返回0./* 返回此窗口小部件的窗口,即具有(或可能具有)窗口系統(tǒng)框架的下一個(gè)祖先窗口小部件。 如果窗口小部件是窗口,則返回窗口小部件本身。*/QWidget *pWindow = this->window();if (pWindow->isWindow())//如果窗口小部件是獨(dú)立窗口,則返回true,否則返回false。{if (pBtn == TiBar_pMinimizeBtn){pWindow->showMinimized();//最小化窗口小部件,作為圖標(biāo)。調(diào)用此函數(shù)僅影響窗口。}else if (pBtn == TiBar_pMaximizeBtn){pWindow->isMaximized() ? pWindow->showNormal() : pWindow->showMaximized();//放大縮小}else if (pBtn == TiBar_pCloseBtn){pWindow->close();//關(guān)閉窗口}} }void TitleBar::mouseDoubleClickEvent(QMouseEvent *event) {Q_UNUSED(event);emit TiBar_pMaximizeBtn->clicked(); }void TitleBar::mousePressEvent(QMouseEvent *event) {if (ReleaseCapture()){QWidget *pWindow = this->window();if (pWindow->isWindow()){SendMessage(HWND(pWindow->winId()), WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);}}event->ignore(); }bool TitleBar::eventFilter(QObject *obj, QEvent *event) {switch (event->type()){case QEvent::WindowTitleChange:{QWidget *pWidget = qobject_cast<QWidget *>(obj);if (pWidget){TiBar_pTitleLabel->setText(pWidget->windowTitle());return true;}}case QEvent::WindowIconChange:{QWidget *pWidget = qobject_cast<QWidget *>(obj);if (pWidget){QIcon icon = pWidget->windowIcon();TiBar_pIconLabel->setPixmap(icon.pixmap(TiBar_pIconLabel->size()));return true;}}case QEvent::WindowStateChange:case QEvent::Resize://updateMaximize();return true;default:return false;}return QWidget::eventFilter(obj, event); } //窗口大小發(fā)生改變 void TitleBar::updateMaximize() {QWidget *pWindow = this->window();if (pWindow->isTopLevel()){bool bMaximize = pWindow->isMaximized();if (bMaximize){TiBar_pMaximizeBtn->setToolTip(tr("Restore"));TiBar_pMaximizeBtn->setProperty("maximizeProperty", "restore");}else{TiBar_pMaximizeBtn->setProperty("maximizeProperty", "maximize");TiBar_pMaximizeBtn->setToolTip(tr("Maximize"));}TiBar_pMaximizeBtn->setStyle(QApplication::style());} }WidgetPar::WidgetPar(QWidget *parent) :QWidget(parent) {}MainWindow.cpp
#include <QGridLayout> #include "titlebar.h" #include "MainWindow.h" {ui->setupUi(this);WidgetPar *selMainWidget = new WidgetPar; //創(chuàng)建一個(gè)QWidget容器selMainWidget->setWindowFlags(Qt::FramelessWindowHint);//將這個(gè)QWidget的邊框去掉this->setParent(selMainWidget);//重新設(shè)置這個(gè)UI界面的父對象為QWidgetTitleBar *pTitleBar = new TitleBar(selMainWidget); //定義一個(gè)標(biāo)題欄類//設(shè)置控件樣式//selMainWidget->setStyleSheet("background-color:#AFFFFF00");this->installEventFilter(pTitleBar);//安裝事件過濾器QGridLayout *pLayout = new QGridLayout();//創(chuàng)建一個(gè)整體布局器pLayout->addWidget(pTitleBar); //添加標(biāo)題欄pLayout->addWidget(this); //添加UI界面pLayout->setSpacing(0); //布局之間的距離pLayout->setContentsMargins(0, 0, 0,0); //布局器的四周邊距selMainWidget->setLayout(pLayout); //將這個(gè)布局器設(shè)置在QWidget上selMainWidget->setAttribute(Qt::WA_TranslucentBackground, true);selMainWidget->setSizePolicy(this->sizePolicy());selMainWidget->setMaximumSize(this->maximumSize());selMainWidget->setMaximumSize(this->maximumSize());this->setWindowTitle(QString::fromLocal8Bit("標(biāo)題"));selMainWidget->show();//顯示QWidge 最后添加 }總結(jié)
以上是生活随笔為你收集整理的QMainWindow界面添加标题栏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: s标签s:select下拉列表的使用
- 下一篇: 监理人员是否知道的电源设备安装及设备接地