Qt之自定义标题栏拓展(十)

Qt开发 系列文章 - user-defined-titlebars(十)


目录

前言

一、方式一

1.效果演示

2.创建标题栏类

3.可视化UI设计

4.定义相关函数

5.使用标题栏类

二、方式二

1.效果演示

2.创建标题栏类

3.定义相关函数

1.初始化函数

2.功能函数

3.窗口关联

4.使用标题栏类

三、方式三

1.实现方式

2.效果演示

总结


前言

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,方式二改进后,修改标题栏不覆盖,效果如下。

1.效果演示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值