zoukankan      html  css  js  c++  java
  • 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;
    }
    
    

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



  • 相关阅读:
    Java基础知识面试题(2021年最新版,持续更新...)整理
    windows10 cmd窗口输出卡住(看这篇就够了)
    windows10 powershell窗口输出卡住(看这篇就够了)
    Golang函数相关
    内存对齐详解
    Go编程模式Pipeline
    管道符、重定向与环境变量(Linux就该这么学第三章)
    GMP模型简介
    新手必须掌握的Linux命令(Linux就该这么学第二章)
    Goland运行项目报错:CreateProcess error=216, 该版本的 %1 与你运行的 Windows 版本不兼容。请查看计算机的系统信息,然后联系软件发布者。
  • 原文地址:https://www.cnblogs.com/DreamDog/p/9160064.html
Copyright © 2011-2022 走看看