QT自定义TitleBar

头文件

#ifndef TITLEBAR_H
#define TITLEBAR_H

/*************************************************

功能:重写标题栏
作者: YYC
时间:2017-10-13

*************************************************/

#include <QObject>
#include <QWidget>
#include <QPushButton>
#include <QLabel>
#include <QMouseEvent>
#include <QComboBox>
#include <QVBoxLayout>


#ifndef SAFEDELETE
#define SAFEDELETE(pointer) \
{ \
if(pointer) \
{ \
delete pointer; \
} \
pointer = NULL; \
}
#endif

namespace TITLEBAR
{
enum WIDGETBYTTONTYPE
{
MAXWIDGET,
MINWIDGET,
MAXMINWIDGET,
};
}

class TitleBar : public QWidget
{
Q_OBJECT
public:
explicit TitleBar(QWidget *parentWidget = 0);

void setWindowTitle(const QString &title); //设置标题
void setWindowIcon(const QString &icon); //设置图标
void subWindowButton(const int &type); //设置按钮

const static int TITLEBARHEIGHT = 50; //标题栏高度
const static int CONTROLWIDTH = 30; //控件宽度

public slots:
void showMax(); //最大化窗口
void showMin(); //最小化窗口
void showClose(); //关闭窗口

private:
bool mousePress; //按钮点击标志位
QPoint movePoint; //鼠标移动
QPushButton *maxButton; //最大化按钮
QPushButton *minButton; //最小化按钮
QPushButton *closeButton; //关闭按钮
QLabel *imgLabel; //图片框
QWidget *parentWidget; //父窗口
QLabel *titleLabel; //标题名

void initValue(); //初始化值
void mousePressEvent(QMouseEvent * event); //鼠标点击事件
void mouseReleaseEvent(QMouseEvent * event); //鼠标释放事件
void mouseMoveEvent(QMouseEvent * event); //鼠标移动事件
};

#endif // TITLEBAR_H


源文件

#include "titlebar.h"
#include <QStyle>
#include <QHBoxLayout>
#include <QDebug>
#include <QListView>

/*************************** 构造函数 ***************************/
TitleBar::TitleBar(QWidget *parent) : QWidget(parent)
{
//最大化按钮设置图标
QPixmap pixMap = this->style()-> standardPixmap(QStyle:: SP_TitleBarMaxButton);
maxButton = new QPushButton(this);
maxButton->setIcon(pixMap);

//最小化按钮设置图标
pixMap = this->style()-> standardPixmap(QStyle:: SP_TitleBarMinButton);
minButton = new QPushButton(this);
minButton->setIcon(pixMap);

//关闭按钮设置图标
pixMap = this->style()-> standardPixmap(QStyle:: SP_TitleBarCloseButton);
closeButton = new QPushButton(this);
closeButton->setIcon(pixMap);

//设置标签
imgLabel = new QLabel(this);
titleLabel = new QLabel(this);
titleLabel->setSizePolicy(QSizePolicy:: Expanding, QSizePolicy:: Fixed);
titleLabel->setStyleSheet("color:white");

//设置控件大小
imgLabel->setFixedSize(CONTROLWIDTH, CONTROLWIDTH);
imgLabel->setScaledContents(true);

//设置控件大小
minButton->setFixedSize(CONTROLWIDTH, CONTROLWIDTH);
maxButton->setFixedSize(CONTROLWIDTH, CONTROLWIDTH);
closeButton->setFixedSize(CONTROLWIDTH, CONTROLWIDTH);

//设置布局
QHBoxLayout *hBoxLayout = new QHBoxLayout(this);
hBoxLayout->addWidget(imgLabel);
hBoxLayout->addSpacing(5);
hBoxLayout->addWidget(titleLabel);
hBoxLayout->addWidget(minButton);
hBoxLayout->addWidget(maxButton);
hBoxLayout->addWidget(closeButton);
hBoxLayout->setSpacing(0);
hBoxLayout->setContentsMargins(5, 0, 5, 0);
this->setLayout(hBoxLayout);

//设置背景色
QPalette paletteColor(palette());
paletteColor.setColor(QPalette:: Background, QColor(44, 62, 80));
this->setAutoFillBackground(true);
this->setPalette(paletteColor);

//重置窗口大小
this->resize(parent->width(), TITLEBARHEIGHT);

//设置父类窗口
parentWidget = parent;

this->initValue();
}

/*************************** 设置标题 ***************************/
void TitleBar::setWindowTitle(const QString &title)
{
titleLabel->setText(title);
}

/*************************** 设置图标 ***************************/
void TitleBar::setWindowIcon(const QString &icon)
{
imgLabel->setPixmap(QPixmap(icon));
}

/*************************** 设置按钮 ***************************/
void TitleBar::subWindowButton(const int &type)
{
if(type == TITLEBAR:: MINWIDGET)
{
SAFEDELETE(minButton);
}
else if(type == TITLEBAR:: MAXWIDGET)
{
SAFEDELETE(maxButton);
}
else if(type == TITLEBAR:: MAXMINWIDGET)
{
SAFEDELETE(minButton);
SAFEDELETE(maxButton);
}
}

/*************************** 初始化 ***************************/
void TitleBar::initValue()
{
//设置样式表
closeButton->setStyleSheet("background-color:transparent;");
minButton->setStyleSheet("background-color:transparent;");
maxButton->setStyleSheet("background-color:transparent;");

//连接信号与槽
connect(minButton, SIGNAL(clicked(bool)), this, SLOT(showMin()));
connect(maxButton, SIGNAL(clicked(bool)), this, SLOT(showMax()));
connect(closeButton, SIGNAL(clicked(bool)), this, SLOT(showClose()));

//按钮点击标志位
mousePress = false;

//将该窗口添加到父类窗口中
QVBoxLayout *vBoxLayout = new QVBoxLayout(parentWidget);

vBoxLayout->addWidget(this);
vBoxLayout->addStretch();
vBoxLayout->setSpacing(0);
vBoxLayout->setContentsMargins(0, 0, 0, 0);
parentWidget->setLayout(vBoxLayout);
}

/*************************** 最大化 ***************************/
void TitleBar::showMax()
{
static int count = 0;

if(count % 2 == 0)
{
QPixmap normalPix = style()-> standardPixmap(QStyle:: SP_TitleBarNormalButton);
maxButton->setIcon(normalPix);

parentWidget->showMaximized();
}
else
{
QPixmap maxPix = style()-> standardPixmap(QStyle:: SP_TitleBarMaxButton);
maxButton->setIcon(maxPix);
parentWidget->showNormal();
}

count ++;
}

/*************************** 最小化 ***************************/
void TitleBar::showMin()
{
parentWidget->showMinimized();
}

/*************************** 关闭 ***************************/
void TitleBar::showClose()
{
parentWidget->close();
}

/*************************** 鼠标点击 ***************************/
void TitleBar:: mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt:: LeftButton)
{
mousePress = true;
}
movePoint = event->globalPos() - parentWidget->pos();
}

/************************** 鼠标释放 ***************************/
void TitleBar:: mouseReleaseEvent(QMouseEvent *event)
{
mousePress = false;
}

/************************** 鼠标移动 **************************/
void TitleBar:: mouseMoveEvent(QMouseEvent *event)
{
if(mousePress)
{
QPoint movePos = event->globalPos();
parentWidget->move(movePos - movePoint);
}
}

在窗口中使用

mainwindow.h 文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "titlebar.h"
#include <QVBoxLayout>
#include <QResizeEvent>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~ MainWindow();

private:
Ui::MainWindow *ui;
TitleBar *titleBar;
void resizeEvent(QResizeEvent *event);
};

#endif // MAINWINDOW_H


mainwindow.cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

this->setWindowFlags(Qt:: FramelessWindowHint);

titleBar = new TitleBar(this);

titleBar->setWindowIcon(":/image/image/image.png");
titleBar->setWindowTitle("灏夏星辰");
}

MainWindow::~ MainWindow()
{
delete ui;
}

/************************ 改变事件 ************************/
void MainWindow:: resizeEvent(QResizeEvent *event)
{
titleBar->resize(this->width(), TitleBar::TITLEBARHEIGHT);
}

具体效果:

下载链接可到我有道云笔记下载附件http://note.youdao.com/noteshare?id=b88a24b0117b30772074400611635fb7&sub=AAF079588C854419B55B76D1543EFAA8

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值