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

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

image.png

目录
相关文章
|
2月前
(8)Qt中的自定义信号
本文介绍了如何在Qt框架中创建和使用自定义信号,并通过一个父子窗口切换的示例来展示自定义信号的实现和应用。
104 3
(8)Qt中的自定义信号
|
2月前
(7)Qt中的自定义槽(函数)
这篇文章介绍了在Qt中如何定义和使用自定义槽函数,包括类成员函数、静态类成员函数、全局函数和lambda表达式作为槽函数的示例,以及使用lambda表达式时的注意事项。
67 2
(7)Qt中的自定义槽(函数)
|
4月前
|
搜索推荐 C++
【Qt 学习笔记】Qt窗口 | 对话框 | 创建自定义对话框
【Qt 学习笔记】Qt窗口 | 对话框 | 创建自定义对话框
151 4
|
4月前
【qt】自定义对话框(2)
【qt】自定义对话框(2)
32 0
|
4月前
【qt】自定义对话框(1)
【qt】自定义对话框(1)
39 0
|
5月前
|
C++
Qt中的信号与槽如何学习?(包括自定义信号)这篇文章告诉你
以现实中的事件来举例的话,例如有两把不同颜色的信号枪,分别是红色,绿色,打响不通颜色的信号枪会触发不同的槽发生,比如说打响红色这个人就跑步,绿色就走步,但是还有一个很重要的机制,那就是连接,我们需要把信号枪去跟这个人的动作连接起来。 如果上面理解没问题的话我们可以把信号和槽看成两个工具,我们最重要的是如何去把这两个工具连接起来。 它的作用可以让我们更加灵活的去使用不同窗口间的切换以及某些事件的连接。
112 0
|
7月前
|
C++
【qt】自定义代理类
【qt】自定义代理类
73 0
|
5月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
199 1
Qt(C++)开发一款图片防盗用水印制作小工具
|
4月前
|
监控 C++ 容器
【qt】MDI多文档界面开发
【qt】MDI多文档界面开发
110 0
|
3月前
|
开发工具 C++
qt开发技巧与三个问题点
本文介绍了三个Qt开发中的常见问题及其解决方法,并提供了一些实用的开发技巧。