Qt 个性化标题栏,自定义标题栏

目前还没有达到自己满意的地步,魔方别人写的的,先提供参考,后面在加入新的东西

头文件

#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;
}

这里的效果还是有问题的,还在排错中



原文地址:https://www.cnblogs.com/DreamDog/p/9160064.html