为什么我的 QWidget 样式表无法识别 objectName 规则?

问题描述 投票:0回答:1

这里我有一个 QComboBox 的子类,它将根据其内容的有效性更改其文本的颜色。

namespace
{
    const QString GOOD = "good";
    const QString BAD  = "bad";
}

NewDBLabel :: NewDBLabel( DB db, const QString & table ) :
    m_db (db)
{
    connect (this, SIGNAL (textChanged (const QString &)),
            this,  SLOT   (changed     (const QString &)));

    setStyleSheet (
        "QWidget#" + GOOD + " {color: black;} "
        "QWidget#" + BAD  + " {color: darkRed;}");
}
    
void NewDBLabel :: changed (const QString & label)
{
    if (m_db .label_exists (m_table, label))
    {
        qWarning ("exists"); // this is printed correctly
        setObjectName (BAD);
        emit valid (false);
    }
    else
    {
        qWarning ("new"); // this is printed correctly
        setObjectName (GOOD);
        emit valid (true);
    }
}

据我所知,这符合文档

QWidget#foo
应该匹配QWidget的子类,其
objectName
foo

我预计

setObjectName
会导致应用不同的样式规则,但这并没有发生。知道为什么吗?

qt qtstylesheets qtwidgets
1个回答
5
投票

语法是正确的,但

stylesheet
不是那么动态。在您的代码中,您在设置
setObjectName()
之后
stylesheet
,因此
objectName
已更改,但
qss
未重新应用。所以尝试使用
unpolish/polish
小部件。在这种情况下,
qss
将能够检测新的
objectNames
和属性。例如:

//in ctor
ui->pushButton->setStyleSheet("QWidget#good {color: green;}"
                              "QWidget#bad  {color: red;}  ");
//in handler
if(ui->pushButton->objectName() == "good")
    ui->pushButton->setObjectName("bad");
else
    ui->pushButton->setObjectName("good");

ui->pushButton->style()->unpolish(ui->pushButton);
ui->pushButton->style()->polish(ui->pushButton);

编辑

在我的答案的第一个版本中,我建议重新应用

stylesheet
,但我删除了它,因为最好最快的方法是
unpolish/polish
小部件。此外,
setStyleSheet()
调用
polish()
并再次解析整个字符串,所以这完全是不必要的步骤,只会降低性能。

© www.soinside.com 2019 - 2024. All rights reserved.