头文件
#ifndef TITLEBAR_H #define TITLEBAR_H #include <QWidget> class QLabel; class QPushButton; class TitleBar : public QWidget { Q_OBJECT public: explicit TitleBar(QWidget *parent = 0); ~TitleBar(); protected: /* * 双击标题栏进行界面最大化/还原 */ virtual void mouseDoubleClickEvent(QMouseEvent *event); /* * 进行鼠标界面的拖动 */ virtual void mousePressEvent(QMouseEvent *event); /* * 设置界面标题与图标 */ virtual bool eventFilter(QObject *watched, 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 // TITLEBAR_H
cpp文件
#include "titlebar.h" #include <QLabel> #include <QPushButton> #include <QHBoxLayout> #include <QEvent> #include <QMouseEvent> #include <QApplication> #include <QSizePolicy> #include <QIcon> #ifdef Q_OS_WIN #pragma comment(lib,"user32.lib") #include <qt_windows.h> #endif TitleBar::TitleBar(QWidget *parent) : QWidget(parent) { /* * 设置标题栏高度 */ this->setFixedHeight(30); /* * 初始化标题栏Button及Lable */ 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_pCloseButton->setFixedSize(27,22); m_pMaximizeButton->setFixedSize(27,22); m_pMiniMizeButton->setFixedSize(27,22); m_pTitleLabel->setObjectName("whiteLabel"); m_pMiniMizeButton->setObjectName("minimizeButton"); m_pMaximizeButton->setObjectName("maximizeButton"); m_pCloseButton->setObjectName("closeButton"); m_pMaximizeButton->setToolTip("Maximize"); m_pMiniMizeButton->setToolTip("Minimize"); 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); this->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->click(); } void TitleBar::mousePressEvent(QMouseEvent *event) { #ifdef Q_OS_WIN if(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 *watched, QEvent *event) { switch (event->type()) { case QEvent::WindowTitleChange: { QWidget* pWidget = qobject_cast<QWidget*>(watched); if(pWidget) { m_pTitleLabel->setText(pWidget->windowTitle()); return true; } } case QEvent::WindowIconChange: { QWidget* pWidget = qobject_cast<QWidget*>(watched); 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(watched,event); } void TitleBar::onClicked() { QPushButton* pButton = qobject_cast<QPushButton*>(sender()); QWidget* pWidget = this->window(); if(pWidget->isTopLevel()) { if(pButton == m_pMiniMizeButton) { pWidget->showMinimized(); } else if(pButton == m_pMaximizeButton) { pWidget->isMaximized()?pWidget->showNormal():pWidget->showMaximized(); } else if(pButton == m_pCloseButton) { pWidget->close(); } } } void TitleBar::updateMaximize() { QWidget* pWidget = this->window(); if(pWidget->isTopLevel()) { bool bMaximize = pWidget->isMaximized(); if(bMaximize) { m_pMaximizeButton->setToolTip("Restore"); m_pMaximizeButton->setProperty("maximizePorperty","restore"); } else { m_pMaximizeButton->setToolTip("Maximize"); m_pMaximizeButton->setProperty("maximizePorperty","maximize"); } m_pMaximizeButton->setStyle(QApplication::style()); } }
使用
#include "widget.h" #include "ui_widget.h" #include "titlebar.h" #include <QPalette> #include <QVBoxLayout> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); //remove the title bar TitleBar* pTitleBar = new TitleBar(this); this->installEventFilter(pTitleBar); this->resize(400,300); this->setWindowTitle("Thunder"); // this->setWindowIcon(QIcon()); QPalette pal(palette()); pal.setColor(QPalette::Background,QColor(50,50,50)); setAutoFillBackground(true); setPalette(pal); QVBoxLayout *pLayout = new QVBoxLayout(); pLayout->addWidget(pTitleBar); pLayout->addStretch(); pLayout->setSpacing(0); pLayout->setContentsMargins(0,0,0,0); this->setLayout(pLayout); } Widget::~Widget() { delete ui; }
这里的效果还是有问题的,还在排错中