qt 自定义标题栏
TitleBar.h
#ifndef TITLE_BAR #define TITLE_BAR#include <QWidget>class QLabel; class QPushButton;class TitleBar : public QWidget {Q_OBJECTpublic:explicit TitleBar(QWidget *parent = 0);~TitleBar();protected:// 雙擊標題欄進行界面的最大化/還原virtual void mouseDoubleClickEvent(QMouseEvent *event);// 進行鼠界面的拖動virtual void mousePressEvent(QMouseEvent *event);// 設置界面標題與圖標virtual bool eventFilter(QObject *obj, QEvent *event);private slots:// 進行最小化、最大化/還原、關閉操作void onClicked();private:// 最大化/還原void updateMaximize();private:QLabel *m_pIconLabel;QLabel *m_pTitleLabel;QPushButton *m_pMinimizeButton;QPushButton *m_pMaximizeButton;QPushButton *m_pCloseButton; };#endif // TITLE_BARTitleBar.cpp
#include <QLabel> #include <QPushButton> #include <QHBoxLayout> #include <QEvent> #include <QMouseEvent> #include <QApplication> #include "TitleBar.h"#ifdef Q_OS_WIN #pragma comment(lib, "user32.lib") #include <qt_windows.h> #endifTitleBar::TitleBar(QWidget *parent): QWidget(parent) {setFixedHeight(30);m_pIconLabel = new QLabel(this);m_pTitleLabel = new QLabel(this);m_pMinimizeButton = new QPushButton(this);m_pMaximizeButton = new QPushButton(this);m_pCloseButton = new QPushButton(this);m_pIconLabel->setFixedSize(20, 20);m_pIconLabel->setScaledContents(true);m_pTitleLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);m_pMinimizeButton->setFixedSize(27, 22);m_pMaximizeButton->setFixedSize(27, 22);m_pCloseButton->setFixedSize(27, 22);m_pTitleLabel->setObjectName("whiteLabel");m_pMinimizeButton->setObjectName("minimizeButton");m_pMaximizeButton->setObjectName("maximizeButton");m_pCloseButton->setObjectName("closeButton");m_pMinimizeButton->setToolTip("Minimize");m_pMaximizeButton->setToolTip("Maximize");m_pCloseButton->setToolTip("Close");QHBoxLayout *pLayout = new QHBoxLayout(this);pLayout->addWidget(m_pIconLabel);pLayout->addSpacing(5);pLayout->addWidget(m_pTitleLabel);pLayout->addWidget(m_pMinimizeButton);pLayout->addWidget(m_pMaximizeButton);pLayout->addWidget(m_pCloseButton);pLayout->setSpacing(0);pLayout->setContentsMargins(5, 0, 5, 0);setLayout(pLayout);connect(m_pMinimizeButton, SIGNAL(clicked(bool)), this, SLOT(onClicked()));connect(m_pMaximizeButton, SIGNAL(clicked(bool)), this, SLOT(onClicked()));connect(m_pCloseButton, SIGNAL(clicked(bool)), this, SLOT(onClicked())); }TitleBar::~TitleBar() {}void TitleBar::mouseDoubleClickEvent(QMouseEvent *event) {Q_UNUSED(event);emit m_pMaximizeButton->clicked(); }void TitleBar::mousePressEvent(QMouseEvent *event) { #ifdef Q_OS_WINif (ReleaseCapture()){QWidget *pWindow = this->window();if (pWindow->isTopLevel()){SendMessage(HWND(pWindow->winId()), WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);}}event->ignore(); #else #endif }bool TitleBar::eventFilter(QObject *obj, QEvent *event) {switch (event->type()){case QEvent::WindowTitleChange:{QWidget *pWidget = qobject_cast<QWidget *>(obj);if (pWidget){m_pTitleLabel->setText(pWidget->windowTitle());return true;}}case QEvent::WindowIconChange:{QWidget *pWidget = qobject_cast<QWidget *>(obj);if (pWidget){QIcon icon = pWidget->windowIcon();m_pIconLabel->setPixmap(icon.pixmap(m_pIconLabel->size()));return true;}}case QEvent::WindowStateChange:case QEvent::Resize:updateMaximize();return true;}return QWidget::eventFilter(obj, event); }void TitleBar::onClicked() {QPushButton *pButton = qobject_cast<QPushButton *>(sender());QWidget *pWindow = this->window();if (pWindow->isTopLevel()){if (pButton == m_pMinimizeButton){pWindow->showMinimized();}else if (pButton == m_pMaximizeButton){pWindow->isMaximized() ? pWindow->showNormal() : pWindow->showMaximized();}else if (pButton == m_pCloseButton){pWindow->close();}} }void TitleBar::updateMaximize() {QWidget *pWindow = this->window();if (pWindow->isTopLevel()){bool bMaximize = pWindow->isMaximized();if (bMaximize){m_pMaximizeButton->setToolTip(tr("Restore"));m_pMaximizeButton->setProperty("maximizeProperty", "restore");}else{m_pMaximizeButton->setProperty("maximizeProperty", "maximize");m_pMaximizeButton->setToolTip(tr("Maximize"));}m_pMaximizeButton->setStyle(QApplication::style());} }
widget.h
widget.cpp
QPushButton#closeButton {background:transparent url(skin/public/close.png) no-repeat center center;border:none;width:20px;height:20px; } QPushButton#closeButton:hover {background:transparent url(skin/public/close_hover.png) no-repeat center center; } QPushButton#closeButton:pressed {background:transparent url(skin/public/close_pressed.png) no-repeat center center; } QPushButton#closeButton:disabled {background:transparent url(skin/public/close_disabled.png) no-repeat center center; }QPushButton#maximizeButton {background:transparent url(skin/public/max.png) no-repeat center center;border:none;width:20px;height:20px; } QPushButton#maximizeButton:hover {background:transparent url(skin/public/max_hover.png) no-repeat center center; } QPushButton#maximizeButton:pressed {background:transparent url(skin/public/max_pressed.png) no-repeat center center; } QPushButton#maximizeButton:disabled {background:transparent url(skin/public/max_disabled.png) no-repeat center center; }QPushButton#minimizeButton {background:transparent url(skin/public/min.png) no-repeat center center;border:none;width:20px;height:20px; } QPushButton#minimizeButton:hover {background:transparent url(skin/public/min_hover.png) no-repeat center center; } QPushButton#minimizeButton:pressed {background:transparent url(skin/public/min_pressed.png) no-repeat center center; } QPushButton#minimizeButton:disabled {background:transparent url(skin/public/min_disabled.png) no-repeat center center; }
總結