QLabel: установить цвет текста и фона

Ответы:

272

Лучший и рекомендуемый способ - использовать Qt Style Sheet .

Чтобы изменить цвет текста и цвет фона QLabel, вот что я хотел бы сделать:

QLabel* pLabel = new QLabel;
pLabel->setStyleSheet("QLabel { background-color : red; color : blue; }");

Вы также можете отказаться от использования таблиц стилей Qt и изменить QPaletteцвет вашегоQLabel , но вы можете получить разные результаты на разных платформах и / или стилях.

Как указано в документации Qt:

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

Но вы могли бы сделать что-то вроде этого:

 QPalette palette = ui->pLabel->palette();
 palette.setColor(ui->pLabel->backgroundRole(), Qt::yellow);
 palette.setColor(ui->pLabel->foregroundRole(), Qt::yellow);
 ui->pLabel->setPalette(palette);

Но, как я уже сказал, я настоятельно рекомендую не использовать палитру и перейти к Qt Style Sheet.

Жером
источник
Я использовал метод setStyleSheet () и, по крайней мере, в Qt 4.4 он заканчивает тем, что вызывает connect и материал стилей и вызывает увеличение использования памяти.
Дэйв Йохансен,
Я открыл сообщение об ошибке увеличения использования памяти, которое можно найти здесь .
Дэйв Йохансен
colorАтрибут неэффективен. Только через HTML <font color="#FFFFFF">...</font>я смог установить цвет шрифта (в данном случае, белый.
Пауло Карвалью,
Есть ли способ указать цвет текста по умолчанию на рабочем столе пользователя? Использование color: ;в качестве «перезагрузки», кажется, делает это, но это хорошая практика, или есть лучший метод?
AstroFloyd
38

Вы можете использовать QPalette, однако вы должны setAutoFillBackground(true);включить цвет фона

QPalette sample_palette;
sample_palette.setColor(QPalette::Window, Qt::white);
sample_palette.setColor(QPalette::WindowText, Qt::blue);

sample_label->setAutoFillBackground(true);
sample_label->setPalette(sample_palette);
sample_label->setText("What ever text");

Он отлично работает на Windows и Ubuntu, я не играл ни с какой другой ОС.

Примечание: пожалуйста, смотрите QPalette , раздел роли цвета для более подробной информации.

Шах-Навадж Шухан
источник
Это самый важный элемент ЛЮБОГО подхода (кроме styleSheets.)
Элиягу Скочилас
3
Спасибо, что указали на то, что autoFillBackground является ключевым вопросом здесь. Принятый ответ выше не работает без этой настройки.
BSD
20

Я добавляю этот ответ, потому что думаю, что он может быть полезен для всех.

Я вступаю в проблему установки цветов RGBA (то есть цвета RGB со значением альфа- канала для прозрачности) для цветных меток отображения в моем приложении для рисования.

Когда я наткнулся на первый ответ, я не смог установить цвет RGBA. Я также пробовал такие вещи, как:

myLabel.setStyleSheet("QLabel { background-color : %s"%color.name())

где colorцвет RGBA.

Итак, мое грязное решение состояло в том, чтобы расширить QLabelи переопределить paintEvent()метод, заполняющий его ограничивающий прямоугольник.

Сегодня я открыл qt-assistantи прочел список свойств ссылок на стили . К счастью, у него есть пример, который гласит следующее:

QLineEdit { background-color: rgb(255, 0, 0) }

Это поможет мне сделать что-то вроде приведенного ниже кода, например:

myLabel= QLabel()
myLabel.setAutoFillBackground(True) # This is important!!
color  = QtGui.QColor(233, 10, 150)
alpha  = 140
values = "{r}, {g}, {b}, {a}".format(r = color.red(),
                                     g = color.green(),
                                     b = color.blue(),
                                     a = alpha
                                     )
myLabel.setStyleSheet("QLabel { background-color: rgba("+values+"); }")

Обратите внимание, что setAutoFillBackground()установка в Falseне будет работать.

С Уважением,

Себастьян
источник
14

ЕДИНСТВЕННАЯ вещь, которая работала для меня, была HTML.

И я обнаружил, что это гораздо проще, чем любой из программных подходов.

Следующий код изменяет цвет текста на основе параметра, переданного вызывающей стороной.

enum {msg_info, msg_notify, msg_alert};
:
:
void bits::sendMessage(QString& line, int level)
{
    QTextCursor cursor = ui->messages->textCursor();
    QString alertHtml  = "<font color=\"DeepPink\">";
    QString notifyHtml = "<font color=\"Lime\">";
    QString infoHtml   = "<font color=\"Aqua\">";
    QString endHtml    = "</font><br>";

    switch(level)
    {
        case msg_alert:  line = alertHtml % line; break;
        case msg_notify: line = notifyHtml % line; break;
        case msg_info:   line = infoHtml % line; break;
        default:         line = infoHtml % line; break;
    }

    line = line % endHtml;
    ui->messages->insertHtml(line);
    cursor.movePosition(QTextCursor::End);
    ui->messages->setTextCursor(cursor);
}
paie
источник
То же самое здесь, ни QPalette, ни таблицы стилей не работали для меня, очень раздражает!
я ничего не знаю
Я предпочитаю этот способ, так как он также позволяет вам помещать некоторые другие интересные вещи внутри <font/>тега (и это что-то более знакомое людям HTML: D), а не просто цвет, поэтому он дает вам большую гибкость.
rbaleksandar
@iknownothing таблицы стилей работают через QPalette ... Все использует QPalette.
Виктор Полевой
13

Лучший способ установить любую функцию относительно цветов любого виджета - это использовать QPalette .

И самый простой способ найти то, что вы ищете, это открыть Qt Designer, установить палитру QLabel и проверить сгенерированный код.

alisami
источник
2
В конструкторе нажмите «Форма-> Просмотреть код», чтобы увидеть сгенерированный код.
Алиса
6

Этот работает отлично

QColorDialog *dialog = new QColorDialog(this);
QColor color=  dialog->getColor();
QVariant variant= color;
QString colcode = variant.toString();
ui->label->setStyleSheet("QLabel { background-color :"+colcode+" ; color : blue; }");

getColor()Метод возвращает выбранный цвет. Вы можете изменить цвет этикетки, используяstylesheet

Ишан Фернандо
источник
1
Хотя код ценится, у него всегда должно быть сопутствующее объяснение. Это не должно быть долго, но это ожидается.
Петер - Восстановить Монику
Хотя этот код работает, есть некоторые определенные оптимизации <code> QColor color = QColorDialog :: getColor (QColor (Qt :: white), this, tr ("Select Color"); // используем статическую функцию для выбора цвета, начальное значение - белый </br> ui-> label-> setStyleSheet (QString ("QLabel {background-color:% 1; цвет: синий;}" "+ colcode +"; цвет: синий;} ") .arg ( color.name ()); // color.name возвращает строку в формате #RRGGBB </ code>
Скотт Арон Блум,