QLabel更改字体颜色而不更改任何其他样式

时间:2019-04-03 08:24:41

标签: qt qtstylesheets qlabel

我想动态更改QLabel中文本的颜色。 我已经在ui文件中定义了QLabel的颜色和样式,当某个事件发生时,我想更改它。 我想更改颜色而不更改QLabel的任何其他样式。

我找到了一些解决QLabel中更改文本颜色问题的答案(123),它们都使用功能 setStyleSheet 。此功能可以正常工作,但是它会更改我的字体大小和与QLabel相关的其他样式。

我已经看到问题与 setStyleSheet ignoring any previous style有关。在那里提出的解决方案包括检索要保留的所有样式,然后与文本颜色更改一起重新设置它们。

这麻烦且难以维护。如果将来定义了更多样式,我将需要查看代码的这一部分,以便能够重置所有样式。

我希望能够更改QLabel文本颜色而不更改任何其他样式。有可能吗?

4 个答案:

答案 0 :(得分:0)

您可以创建一些样式类来控制小部件的样式:

class WidgetStyleSheet
{
public:
    // change some style's value
    void setValue(const QString& styleKey, const QString& value)
    {
        _styleMap[styleKey] = value;
    }

    // to default state
    void reset() {}

    // form stylesheet
    QString toStyleSheet() const
    {
        QString styleSheet;
        QMapIterator<QString, QString> iter(_styleMap);
        while( iter.hasNext() )
            styleSheet += QString("%1: %2").arg(iter.key()).arg(iter.value());
        return styleSheet;
    }
private:
    QMap<QString, QString> _styleMap;
}

代码中的某处:

WidgetStyleSheet labelSS;
// ...

labelSS.setValue("color", QString("%1").arg( QColor(255, 10, 0).name() );
labelSS.setValue("background-color", "...");
// ...


label->setStyleSheet(labelSS);

答案 1 :(得分:0)

务实的方法:

利用CSS的级联性。

  • QLabel包裹在QWidget中(不要忘记QLayout)。
  • 在周围的QWidget上设置默认样式。
  • 将字体颜色设置为QLabel的唯一样式。

答案 2 :(得分:0)

如果要管理QLabel的文本颜色,可以使用自定义类包装它。

例如:

class ColorLabel : public QLabel
{
public:
    ColorLabel(const QString &text, QWidget *parent = nullptr)
        : QLabel(text, parent)
    {
        setAutoFillBackground(true);
    }

    void setTextColor(const QColor &color)
    {
        QPalette palette = this->palette();
        palette.setColor(this->backgroundRole(), color);
        palette.setColor(this->foregroundRole(), color);
        this->setPalette(palette);
    }
};

并在您的代码中使用它:

 ColorLabel * poColorLabel = new ColorLabel("My string", this);
 poColorLabel->setTextColor(Qt::red); // set label text in red color

仅供参考:我在Fedora Qt5.12上进行了测试,效果很好。

答案 3 :(得分:0)

以下工作正常。但这不是那么优雅。这是在python中。您必须将按钮名称(或其他任何名称)传递给数组中定义的以下名称

        btns = ['self.hBeamBtn','self.lBeamBtn','self.allTestBtn','self.prnStatusBtn']
        for btn in btns:
            if  str(btn_name) == str(btn):
                styl = btn+'.setStyleSheet("font: bold;background-color: red;font-size: 12px;height: 28px;width: 80px;")'
                eval(styl)