动态改变样式 即动态属性,如点击按钮可以让按钮的样式改变:从红色->蓝色->绿色
我们来了解一下这个函数:
bool QObject::setProperty(const char *name, const QVariant &value)
这个函数是干什么?
对于一个基于QObject的控件来讲,可以通过setProperty来设置属性
它的参数是什么?
const char *name:即自定义的属性名称,注意不要和控件的默认属性名称相同
const QVariant &value: 为此属性的值
具体的看此链接:QT property属性的应用
它对本文有来说怎么使用呢?
我们的需求:动态改变按钮的样式 ,接下来就会有很大的作用
1.我们需要新建一个类,在ui里放一个pushButton,然后给按钮设置好样式
右键我们的pushButton点击样式表,内容为:
第一行为初始颜色,PropertyTest为我们新建的类名,borderColor为我们需要设置的属性,“=”后的为属性的值,btn为我们pushButton的ObjectName
#btn{border:4px solid blue;}
PropertyTest[borderColor="red"] #btn{border:4px solid red;}
PropertyTest[borderColor="green"] #btn{border:4px solid green;}
PropertyTest[borderColor="blue"] #btn{border:4px solid blue;}
2,声明点击按钮的槽函数
private slots:
void changeBorderColor(); //改变属性的颜色
private:
int m_iTest; //点击的次数
3.连接我们的槽函数
connect(ui.btn, &QPushButton::clicked, this, &PropertyTest::changeBorderColor);
4.定义我们的槽函数内容
void PropertyTest::changeBorderColor()
{
if (m_iTest % 3 == 0)
{
setProperty("borderColor", "red");
}
else if (m_iTest % 3 == 1)
{
setProperty("borderColor", "green");
}
else
{
setProperty("borderColor", "blue");
}
//手动更新样式的两种方式 第一种
//ui.btn->style()->unpolish(ui.btn); //清理之前的样式
//ui.btn->style()->polish(ui.btn); //用于添加新的样式
//ui.btn->update();
//第二种
ui.btn->setStyle(QApplication::style());
m_iTest++;
}
效果:
第二种方法:
1.同方法一的第一步
2.我们需要添加继承自QObject的类中使用 Q_PROPERTY 宏指令
这个宏是干啥的呢?
看下本例子中:
Q_PROPERTY(QString borderColor READ getBorderColor WRITE setBorderColor)
依据Q_PROPERTY
(参数类型 参数名称 READ 获得属性值函数 WRITE 设置属性值函数)
参数类型:QString
参数名称:borderColor
获得属性值函数:getBorderColor
设置属性值函数:setBorderColor
看具体宏链接:Q_PROPERTY介绍
3.定义我们在宏中写的读写的成员函数 和 保存设置的颜色
public:
void setBorderColor(const QString& strBorderColor) { m_strBorderColor = strBorderColor; }
QString getBorderColor() { return m_strBorderColor; }
private:
QString m_strBorderColor;
int m_iTest;
4.同上一个方法的第三步
5.定义我们的槽函数
void PropertyTest::changeBorderColor()
{
if (m_iTest % 3 == 0)
{
setBorderColor("red");
}
else if (m_iTest % 3 == 1)
{
setBorderColor("green");
}
else
{
setBorderColor("blue");
}
//手动更新样式
//ui.btn->style()->unpolish(ui.btn);
//ui.btn->style()->polish(ui.btn);
//ui.btn->update();
ui.btn->setStyle(QApplication::style());
m_iTest++;
}
效果和第一种一样
完整代码:
PropertyTest.h
#pragma once
#include
#include "ui_PropertyTest.h"
#include
#include
class PropertyTest : public QWidget
{
Q_OBJECT
//Q_PROPERTY(QString borderColor READ getBorderColor WRITE setBorderColor)
public:
PropertyTest(QWidget *parent = Q_NULLPTR);
~PropertyTest();
//void setBorderColor(const QString& strBorderColor) { m_strBorderColor = strBorderColor; }
//QString getBorderColor() { return m_strBorderColor; }
private slots:
void changeBorderColor();
private:
Ui::PropertyTestClass ui;
QString m_strBorderColor;
int m_iTest;
};
PropertyTest.cpp
#include "PropertyTest.h"
PropertyTest::PropertyTest(QWidget *parent)
: QWidget(parent), m_iTest(0)
{
ui.setupUi(this);
connect(ui.btn, &QPushButton::clicked, this, &PropertyTest::changeBorderColor);
}
PropertyTest::~PropertyTest()
{
}
void PropertyTest::changeBorderColor()
{
if (m_iTest % 3 == 0)
{
setProperty("borderColor", "red");
//setBorderColor("red");
}
else if (m_iTest % 3 == 1)
{
setProperty("borderColor", "green");
//setBorderColor("green");
}
else
{
setProperty("borderColor", "blue");
//setBorderColor("blue");
}
//手动更新样式
//ui.btn->style()->unpolish(ui.btn);
//ui.btn->style()->polish(ui.btn);
//ui.btn->update();
ui.btn->setStyle(QApplication::style());
m_iTest++;
}
参考博客:
Qt之动态属性unpolish()和polish()
QT property属性的应用
Q_PROPERTY介绍