QLabel меняет цвет шрифта, не меняя стиль - PullRequest
0 голосов
/ 03 апреля 2019

Я хочу динамически менять цвет текста в QLabel.Я определил цвет и стиль QLabel в файле пользовательского интерфейса, и я хочу изменить его, когда происходит определенное событие.Я хочу изменить цвет, не меняя стиль моего QLabel.

Я нашел несколько ответов на проблему изменения цвета текста в QLabel ( 1 , 2 , 3 ), и все они используютфункция setStyleSheet .Эта функция работает нормально, но она меняет мой размер шрифта и другие стили, связанные с QLabel.

Я видел, что проблема связана с setStyleSheet , игнорируя любой предыдущий стиль ,Предложенное решение включает в себя извлечение всех стилей, которые я хочу сохранить, и настройку их снова вместе с изменением цвета текста.

Это громоздко и сложно поддерживать.Если бы в будущем было определено больше стилей, мне нужно было бы просмотреть эту часть кода, чтобы можно было сбросить все из них.

Я бы хотел иметь возможность изменять цвет текста QLabel без изменения какого-либо другого стиля.Возможно ли это?

Ответы [ 3 ]

0 голосов
/ 03 апреля 2019

Прагматичный подход:

Использование каскадирования CSS.

  • Оберните ваш QLabel в QWidget (не забудьте QLayout).
  • Установите стиль по умолчанию для окружающих QWidget.
  • Установите цвет шрифта как единственный стиль QLabel.
0 голосов
/ 03 апреля 2019

Если вы хотите управлять цветом текста 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, и он отлично работает.

0 голосов
/ 03 апреля 2019

Вы можете создать некоторый класс стилей для управления стилем виджета:

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);
...