通俗来讲,添加标题栏相当于添加一个控件
首先可以创建一个标题栏控件;
然后再创建一个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 最后添加
}