QMainWindow界面添加标题栏

通俗来讲,添加标题栏相当于添加一个控件
首先可以创建一个标题栏控件;
然后再创建一个widget,把MainWindow和标题栏控件通过布局加进去。
参考:Qt 之 自定义窗口标题栏
Qt自定义标题栏
标题栏控件:
TitleBar.h

#ifndef TITLEBAR_H
#define TITLEBAR_H

#include <QWidget>
#include <QLabel>
#include <QPushButton>

/*
定义一个新的QWidget类,将标题栏和UI界面都放到这个类里面,定义这个类是为了方便改变主题
*/
class WidgetPar : public QWidget
{
    Q_OBJECT
public:
    explicit WidgetPar(QWidget *parent = 0);

signals:

public slots:
    //void paintEvent(QPaintEvent *event);
};

/*
自定义的标题栏类
*/
class TitleBar : public QWidget
{
    Q_OBJECT
public:
    explicit TitleBar(QWidget *parent = 0);

signals:

public slots:
    //右上角三个按钮共用一个槽函数
    void on_TiBar_Clicked();

protected:
    //重写鼠标事件
    virtual void mouseDoubleClickEvent(QMouseEvent *event);// 双击标题栏进行界面的最大化/还原
    virtual void mousePressEvent(QMouseEvent *event);// 进行鼠界面的拖动
    virtual bool eventFilter(QObject *obj, QEvent *event);// 设置界面标题与图标

    // 标题栏跑马灯效果时钟;
    //QTimer m_titleRollTimer;
private:
    void updateMaximize();// 最大化/还原

private://自定义标题栏控件
    QLabel *TiBar_pIconLabel;               //左上角图标label
    QLabel *TiBar_pTitleLabel;              //中间标题栏label
    QPushButton *TiBar_pMinimizeBtn;        //右上角缩小到底部任务栏按钮,最小化
    QPushButton *TiBar_pMaximizeBtn;        //右上角放大缩小按钮
    QPushButton *TiBar_pCloseBtn;           //右上角关闭按钮
public:


};

#endif // TITLEBAR_H

TitleBar.cpp

#include "titlebar.h"
#include <QHBoxLayout>
#include <QEvent>
#include <QMouseEvent>
#include <QApplication>

#include <qt_windows.h>
#include <QPainter>

#include <QDebug>
TitleBar::TitleBar(QWidget *parent) :
    QWidget(parent)
{
    TiBar_pIconLabel    = new QLabel;
    TiBar_pTitleLabel   = new QLabel;
    TiBar_pMinimizeBtn  = new QPushButton;
    TiBar_pMaximizeBtn  = new QPushButton;
    TiBar_pCloseBtn     = new QPushButton;

    TiBar_pIconLabel->setFixedSize(32, 32); //设置图标固定大小
    TiBar_pIconLabel->setScaledContents(true);  //设置图片显示合适大小

    TiBar_pTitleLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);//此属性保存窗口小部件的默认布局行为。

    TiBar_pMinimizeBtn->setFixedSize(32, 32);//设置三个按钮的固定大小
    TiBar_pMaximizeBtn->setFixedSize(32, 32);
    TiBar_pCloseBtn->setFixedSize(32, 32);
    TiBar_pTitleLabel->setFixedHeight(32);


    TiBar_pMinimizeBtn->setIcon(QIcon(":/image/image/small.ico"));
    TiBar_pMinimizeBtn->setIconSize(TiBar_pMinimizeBtn->size());
    TiBar_pMaximizeBtn->setIcon(QIcon(":/image/image/max.ico"));
    TiBar_pMaximizeBtn->setIconSize(TiBar_pMinimizeBtn->size());
    TiBar_pCloseBtn->setIcon(QIcon(":/image/image/close.ico"));
    TiBar_pCloseBtn->setIconSize(TiBar_pMinimizeBtn->size());
    QPixmap icon(":/image/image/lk.ico");
    TiBar_pIconLabel->setPixmap(icon);
    //TiBar_pIconLabel->resize(icon.width(),icon.height());


    TiBar_pTitleLabel->setObjectName("whiteLabel"); //此属性保存此对象的名称。
    TiBar_pMinimizeBtn->setObjectName("minimizeButton");
    TiBar_pMaximizeBtn->setObjectName("maximizeButton");
    TiBar_pCloseBtn->setObjectName("closeButton");

    TiBar_pMinimizeBtn->setToolTip("最小化"); //鼠标停留在上面的提示
    TiBar_pMaximizeBtn->setToolTip("放大/缩小");
    TiBar_pCloseBtn->setToolTip("关闭");

    QHBoxLayout *pLayout = new QHBoxLayout(this);
    pLayout->addWidget(TiBar_pIconLabel);
    //pLayout->addSpacing(5);
    pLayout->addWidget(TiBar_pTitleLabel);
    pLayout->addWidget(TiBar_pMinimizeBtn);
    pLayout->addWidget(TiBar_pMaximizeBtn);
    pLayout->addWidget(TiBar_pCloseBtn);
    pLayout->setSpacing(0);//设置控件之间的间距
    pLayout->setContentsMargins(0, 0, 0, 0);//设置左上右下的边距

    this->setLayout(pLayout);

    connect(TiBar_pMinimizeBtn,SIGNAL(clicked()),this,SLOT(on_TiBar_Clicked()));
    connect(TiBar_pMaximizeBtn,SIGNAL(clicked()),this,SLOT(on_TiBar_Clicked()));
    connect(TiBar_pCloseBtn,SIGNAL(clicked()),this,SLOT(on_TiBar_Clicked()));
}
/*  标题栏右上角三个按钮的槽函数*/
void TitleBar::on_TiBar_Clicked()
{
    QPushButton *pBtn = qobject_cast<QPushButton *>(sender());//如果在由信号激活的槽中调用,则返回指向发送信号的对象的指针; 否则它返回0.
    /*  返回此窗口小部件的窗口,即具有(或可能具有)窗口系统框架的下一个祖先窗口小部件。 如果窗口小部件是窗口,则返回窗口小部件本身。*/
    QWidget *pWindow = this->window();
    if (pWindow->isWindow())//如果窗口小部件是独立窗口,则返回true,否则返回false。
    {
        if (pBtn == TiBar_pMinimizeBtn)
        {
            pWindow->showMinimized();//最小化窗口小部件,作为图标。调用此函数仅影响窗口。
        }
        else if (pBtn == TiBar_pMaximizeBtn)
        {
            pWindow->isMaximized() ? pWindow->showNormal() : pWindow->showMaximized();//放大缩小
        }
        else if (pBtn == TiBar_pCloseBtn)
        {
            pWindow->close();//关闭窗口
        }
    }
}

void TitleBar::mouseDoubleClickEvent(QMouseEvent *event)
{
    Q_UNUSED(event);
    emit TiBar_pMaximizeBtn->clicked();
}

void TitleBar::mousePressEvent(QMouseEvent *event)
{
    if (ReleaseCapture())
    {
        QWidget *pWindow = this->window();
        if (pWindow->isWindow())
        {
           SendMessage(HWND(pWindow->winId()), WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
        }
    }
    event->ignore();
}

bool TitleBar::eventFilter(QObject *obj, QEvent *event)
{
    switch (event->type())
    {
        case QEvent::WindowTitleChange:
        {
            QWidget *pWidget = qobject_cast<QWidget *>(obj);
            if (pWidget)
            {
                TiBar_pTitleLabel->setText(pWidget->windowTitle());
                return true;
            }
        }
        case QEvent::WindowIconChange:
        {
            QWidget *pWidget = qobject_cast<QWidget *>(obj);
            if (pWidget)
            {
                QIcon icon = pWidget->windowIcon();
                TiBar_pIconLabel->setPixmap(icon.pixmap(TiBar_pIconLabel->size()));
                return true;
            }
        }
        case QEvent::WindowStateChange:
        case QEvent::Resize:
            //updateMaximize();
            return true;
        default:
            return false;
    }
    return QWidget::eventFilter(obj, event);
}
//窗口大小发生改变
void TitleBar::updateMaximize()
{
    QWidget *pWindow = this->window();
    if (pWindow->isTopLevel())
    {
        bool bMaximize = pWindow->isMaximized();
        if (bMaximize)
        {
            TiBar_pMaximizeBtn->setToolTip(tr("Restore"));
            TiBar_pMaximizeBtn->setProperty("maximizeProperty", "restore");
        }
        else
        {
            TiBar_pMaximizeBtn->setProperty("maximizeProperty", "maximize");
            TiBar_pMaximizeBtn->setToolTip(tr("Maximize"));
        }
        TiBar_pMaximizeBtn->setStyle(QApplication::style());
    }
}

WidgetPar::WidgetPar(QWidget *parent) :
    QWidget(parent)
{

}

MainWindow.cpp

#include <QGridLayout>
#include "titlebar.h"
#include "MainWindow.h"
{
		ui->setupUi(this);

        WidgetPar *selMainWidget = new WidgetPar; //创建一个QWidget容器
        selMainWidget->setWindowFlags(Qt::FramelessWindowHint);//将这个QWidget的边框去掉

        this->setParent(selMainWidget);//重新设置这个UI界面的父对象为QWidget
        TitleBar *pTitleBar = new TitleBar(selMainWidget); //定义一个标题栏类


        //设置控件样式
        //selMainWidget->setStyleSheet("background-color:#AFFFFF00");

        this->installEventFilter(pTitleBar);//安装事件过滤器
        QGridLayout *pLayout = new QGridLayout();//创建一个整体布局器
        pLayout->addWidget(pTitleBar);  //添加标题栏
        pLayout->addWidget(this);       //添加UI界面
        pLayout->setSpacing(0);         //布局之间的距离
        pLayout->setContentsMargins(0, 0, 0,0); //布局器的四周边距
        selMainWidget->setLayout(pLayout);  //将这个布局器设置在QWidget上
        selMainWidget->setAttribute(Qt::WA_TranslucentBackground, true);
        selMainWidget->setSizePolicy(this->sizePolicy());
        selMainWidget->setMaximumSize(this->maximumSize());
        selMainWidget->setMaximumSize(this->maximumSize());
        this->setWindowTitle(QString::fromLocal8Bit("标题"));

        selMainWidget->show();//显示QWidge 最后添加
}

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值