QLabel меняет цвет шрифта, не меняя стиль
Я хочу динамически менять цвет текста в QLabel. Я определил цвет и стиль QLabel в файле пользовательского интерфейса, и я хочу изменить его, когда происходит определенное событие. Я хочу изменить цвет, не меняя стиль моего QLabel.
Я нашел несколько ответов на проблему изменения цвета текста в QLabel ( 1, 2, 3), и все они используют функцию setStyleSheet. Эта функция работает нормально, но она меняет мой размер шрифта и другие стили, связанные с QLabel.
Я видел, что проблема связана с тем, что setStyleSheet игнорирует любой предыдущий стиль. Предложенное решение включает в себя получение всех стилей, которые я хочу сохранить, и настройку их снова вместе с изменением цвета текста.
Это громоздко и трудно поддерживать. Если бы в будущем было определено больше стилей, мне нужно было бы просмотреть эту часть кода, чтобы иметь возможность сбросить все из них.
Я хотел бы иметь возможность изменить цвет текста QLabel без изменения любого другого стиля. Является ли это возможным?
3 ответа
Если вы хотите управлять цветом текста 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, и он отлично работает.
Прагматичный подход:
Используйте каскадность CSS.
- Оберните
QLabel
вQWidget
(не забудьтеQLayout
). - Установите стиль по умолчанию для окружающих
QWidget
, - Установите цвет шрифта как
QLabel
Единственный стиль.
Следующее работает нормально. Но это не так уж и элегантно. Это в питоне. Вы должны передать имя кнопки (или любое другое) следующему, как определено в массиве
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)
Вы можете создать некоторый класс стилей для управления стилем виджета:
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);