我想动态更改QLabel中文本的颜色。我在ui文件中定义了QLabel的颜色和样式,我想在发生某个事件时更改它。我想改变颜色而不改变我的QLabel的任何其他风格。
我找到了几个答案,解决了在QLabel(1,2,3)中更改文本颜色的问题,并且它们都使用函数setStyleSheet。此功能工作正常,但它会更改我的字体大小和与QLabel相关的其他样式。
我已经看到问题与setStyleSheet ignoring any previous style有关。那里提出的解决方案涉及检索我想要维护的所有样式,并将其与文本颜色更改一起再次设置。
这很麻烦且难以维护。如果将来定义了更多样式,我需要查看代码的这一部分,以便能够重置所有样式。
我希望能够在不改变任何其他syle的情况下更改QLabel文本颜色。可能吗?
务实的方法:
利用CSS的级联性。
QLabel
包裹在QWidget
(别忘了QLayout
)。QWidget
上设置默认样式。QLabel
唯一的样式。您可以创建一些样式类来控制窗口小部件的样式:
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);
如果您想管理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上进行了测试,它运行正常。