问题:希望根据控件ID或属性选择不同的样式,当修改了ID或属性后样式并没有改变
官方文档对selector的说明:Selector Types
Property Selector
中提到
Warning: If the value of the Qt property changes after the style sheet has been set, it might be necessary to force a style sheet recomputation. One way to achieve this is to unset the style sheet and set it again.
当属性改变发生在setStyleSheet之后,需要先重新设置一次stylesheet。其实不仅是属性,控件ID也需要做这一步
示例:
测试不同的selector方法
//qtstylesheet.h
#include <QtWidgets/QMainWindow>
#include "ui_qtstylesheet.h"
class QtStylesheet : public QMainWindow
{
Q_OBJECT
public:
QtStylesheet(QWidget *parent = Q_NULLPTR);
public slots:
void on_pushButtonObjectName_clicked();
void on_pushButtonProperty_clicked();
void on_pushButtonObjectNameProperty_clicked();
private:
void ActivateStylesheet(QWidget *wig);
Ui::QtStylesheetClass ui;
};
//qtstylesheet.cpp
#include "qtstylesheet.h"
QtStylesheet::QtStylesheet(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
//测试通过ObjectName选择不同的样式
ui.pushButtonObjectName->setStyleSheet(
"QPushButton#pushButtonObjectName_1{border:3px solid red; }");
//测试通过Property选择不同的样式
ui.pushButtonProperty->setStyleSheet(
"QPushButton[flag=\"true\"]{border:3px solid green;}");
ui.pushButtonProperty->setProperty("flag", false);
//测试通过ObjectName+Property选择不同的样式
ui.pushButtonObjectNameProperty->setStyleSheet(
"QPushButton#pushButtonObjectNameProperty[flag=\"true\"]{border:3px solid red;}" \
"QPushButton#pushButtonObjectNameProperty_1[flag=\"false\"]{border:3px solid yellow;}" \
"QPushButton#pushButtonObjectNameProperty_1[flag=\"true\"]{border:3px solid green;}" \
);
ui.pushButtonObjectNameProperty->setProperty("flag", false);
}
void QtStylesheet::on_pushButtonObjectName_clicked()
{
static bool flag = true;
if (flag)
{
ui.pushButtonObjectName->setObjectName("pushButtonObjectName_1"); //显示红色边框
}
else
{
ui.pushButtonObjectName->setObjectName("pushButtonObjectName"); //默认样式
}
ActivateStylesheet(ui.pushButtonObjectName); //激活样式
flag = !flag;
}
void QtStylesheet::on_pushButtonProperty_clicked()
{
static bool flag = true;
if (flag)
{
ui.pushButtonProperty->setProperty("flag", true); //显示绿色边框
}
else
{
ui.pushButtonProperty->setProperty("flag", false); //默认样式
}
ActivateStylesheet(ui.pushButtonProperty); //激活样式
flag = !flag;
}
void QtStylesheet::on_pushButtonObjectNameProperty_clicked()
{
static int flag = 1;
switch (flag)
{
case 0:{
ui.pushButtonObjectNameProperty->setObjectName("pushButtonObjectNameProperty");
ui.pushButtonObjectNameProperty->setProperty("flag", false);
}break;
case 1:{
ui.pushButtonObjectNameProperty->setObjectName("pushButtonObjectNameProperty");
ui.pushButtonObjectNameProperty->setProperty("flag", true);
}break;
case 2:{
ui.pushButtonObjectNameProperty->setObjectName("pushButtonObjectNameProperty_1");
ui.pushButtonObjectNameProperty->setProperty("flag", false);
}break;
case 3:{
ui.pushButtonObjectNameProperty->setObjectName("pushButtonObjectNameProperty_1");
ui.pushButtonObjectNameProperty->setProperty("flag", true);
}break;
}
ActivateStylesheet(ui.pushButtonObjectNameProperty); //激活样式
flag++;
if (flag == 4) flag = 0;
}
void QtStylesheet::ActivateStylesheet(QWidget *wig)
{
//方案1
QString ss = wig->styleSheet();
wig->setStyleSheet(""); //unset
wig->setStyleSheet(ss); //set
//方案2
//wig->style()->unpolish(wig);
//wig->style()->polish(wig);
}