Qt开发 系列文章 - user-defined-titlebars(十)
目录
前言
Qt自带的窗口标题栏通常遵循操作系统的默认样式和布局,以确保在不同平台上都能提供一致且符合用户期望的用户体验,因此Qt自带的窗口标题栏无法自定义。但我们在Qt设计软件时,经常需要改变窗口标题栏的样式,以满足不同场合用户需求。本文紧接着上一篇博文Qt之修改窗口标题、图标以及自定义标题栏(九)-优快云博客的基础上,在介绍几种实现自定义标题栏的方法,并提供简单示例。
一、方式一
上一篇博文Qt之修改窗口标题、图标以及自定义标题栏(九)实现该方式是通过直接手鲁编写标题栏UI代码,下面提供的方式是在可视化界面UI上来设计标题栏,简洁方便直观,然后绑定/链接到主窗口界面上。
1.效果演示
2.创建标题栏类
跟上一个有区别的是,在原有的项目上,添加新的类文件,选择带ui设计类的模版,选择如下。
然后,定义类和ui的名称为MyTitleBar,MyTitleBar类的头文件代码如下(示例):
/** 只提供与上一篇不一样的代码地方 **/
QT_BEGIN_NAMESPACE
namespace Ui { class MyTitleBar; }
QT_END_NAMESPACE
class MyTitleBar : public QWidget
{
private slots:
// 按钮触发的槽;
void on_m_pButtonClose_clicked();
void on_m_pButtonMax_clicked();
void on_m_pButtonRestore_clicked();
void on_m_pButtonMin_clicked();
private:
Ui::MyTitleBar *ui;
};
3.可视化UI设计
上面我们定义标题栏类的头文件,下面来在可视化界面UI上来设计标题栏,双击打开.ui文件,在图像化设计界面设计如下标题栏。
上面设计完后,Qt会自动生成相应的UI代码和头文件,相关类为Ui_MyTitleBar。
4.定义相关函数
设计好MyTitleBar的UI文件后,下面来说明相关功能函数。
#include "ui_mytitlebar.h"
#include "mytitlebar.h"
MyTitleBar::MyTitleBar(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MyTitleBar)
{
// UI初始化
ui->setupUi(this);
// 初始化控件
initControl();
// 初始化标题栏色彩
setBackgroundColor(m_colorR, m_colorG, m_colorB, m_isTransparent);
// 加载本地样式 .css文件
//loadStyleSheet("MyTitle");
// 初始化标题栏色彩
setBackgroundColor(230,232,250,0);
setStyleSheet("QToolButton#m_pButtonMenu,QPushButton#m_pButtonMin,QPushButton#m_pButtonMax,QPushButton#m_pButtonClose{\
border-radius:3px;\
color:#324C6C;\
padding:3px;\
margin:0px;\
background:none;\
border-style:none;\
}");
setStyleSheet("QToolButton#m_pButtonMenu:hover,QPushButton#m_pButtonMin:hover,QPushButton#m_pButtonMax:hover{\
color:#FFFFFF;\
margin:1px 1px 2px 1px;\
background-color:rgba(51,127,209,230);\
}");
}
MyTitleBar::~MyTitleBar()
{
}
void MyTitleBar::initControl()
{
m_colorR=0;
m_colorG=153;
m_colorB=153;
m_isPressed=false;
m_buttonType=MIN_MAX_BUTTON;
m_windowBorderWidth=0;
m_isTransparent=false;
setFixedHeight(30);
setWindowFlags(Qt::FramelessWindowHint);
// 添加换肤菜单
QStringList name;
name << "银色" << "蓝色" << "浅蓝色" << "深蓝色";
foreach (QString str, name) {
QAction *action = new QAction(str, this);
ui->m_pButtonMenu->addAction(action);
connect(action, SIGNAL(triggered(bool)), this, SLOT(onButtonchangeStyle()));
}
}
// 以下为按钮操作响应的槽
void MyTitleBar::onButtonchangeStyle()
{
QAction *act = (QAction *)sender();
QString name = act->text();
//QString qssFile = "qss/blue.css";
if (name == "银色") {
//qssFile = "qss/silvery.css";
setBackgroundColor(230,232,250,0);
}
else if (name == "蓝色"){
//qssFile = "qss/blue.css";
setBackgroundColor(50,76,108,0);
}
else if (name == "浅蓝色"){
//qssFile = "qss/lightblue.css";
setBackgroundColor(56,100,135,0);
}
else if (name == "深蓝色"){
//qssFile = "qss/darkblue.css";
setBackgroundColor(122,175,227,0);
}
//loadStyleSheet(qssFile);
//emit signalchangeStyle(qssFile);
}
void MyTitleBar::on_m_pButtonClose_clicked()
{
emit signalButtonCloseClicked();
}
void MyTitleBar::on_m_pButtonMax_clicked()
{
ui->m_pButtonMax->setVisible(false);
ui->m_pButtonRestore->setVisible(true);
emit signalButtonMaxClicked();
}
void MyTitleBar::on_m_pButtonRestore_clicked()
{
ui->m_pButtonRestore->setVisible(false);
ui->m_pButtonMax->setVisible(true);
emit signalButtonRestoreClicked();
}
void MyTitleBar::on_m_pButtonMin_clicked()
{
emit signalButtonMinClicked();
}
5.使用标题栏类
在用户的构造函数上面添加对标题栏类的使用,跟上一篇博文一样。
二、方式二
方式一实现自定义标题栏时,定义一个标题栏类,在生成标题栏时,会覆盖原有的MenuBar和ToolBar,方式二改进后,修改标题栏不覆盖,效果如下。