Как установить цвет фона виджета, например, поля со списком или двойное вращение? - PullRequest
34 голосов
/ 07 октября 2008

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

Я видел некоторую функцию с именем SetBackgroundRole, которая принимает Qt::ColorRole, но я не уверен, как использовать эту функцию.

Пожалуйста, дайте мне знать, каков простой способ изменить цвет фона QComboBox или QDoubleSpinBox?

Ответы [ 9 ]

42 голосов
/ 07 октября 2008

fhe, как правило, правильно, но не учитывает виджеты (например, спин-боксы и кнопки / списки), которые используют другую роль фона в палитре. Более общее решение будет примерно таким:

QPalette pal = widget.palette();
pal.setColor(widget.backgroundRole(), Qt::blue);
widget.setPalette(pal);

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

37 голосов
/ 07 октября 2008

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

Чтобы убедиться, что цвет вашего фона будет правильным, я бы предложил использовать Qt Style Sheet . Вот что я сделал, чтобы изменить цвет фона QComboBox:

myComboBox->setStyleSheet("QComboBox { background-color: blue; }");

Я специально не пробовал для QSpinBox, но я думаю, он будет работать так же!

12 голосов
/ 02 июня 2010

На самом деле, если вы посмотрите документы Qt для QPalette в случае QComboBox, роль фона, вероятно, не та, которую вы хотите. То, что вы хотите:

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

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

QPalette pal = myComboBox->palette();
pal.setColor(QPalette::Base, pal.color(QPalette::Window));
myComboBox->setPalette(pal);
11 голосов
/ 15 октября 2009

Очевидно, что в Qt 4.1 и далее вам нужно установить this->setAutoFillBackground( true );, чтобы палитра применяла цвет фона.

3 голосов
/ 22 января 2014

Хотя предыдущие ответы могут устанавливать цвет фона для нередактируемого QComboBox, они не работают для редактируемого QComboBox. В этом случае вам нужно извлечь виджет QLineEdit, используемый для редактирования, и сбросить его фон.

Вот как я заставил это работать:

    QComboBox *myComboBox = new QComboBox();
    myComboBox->setEditable(true);
    QColor backColor = QColor(246, 230, 230);
    QLineEdit *lineEditor = myComboBox->lineEdit();
    QPalette pal = lineEditor->palette();
    pal.setColor(QPalette::Base, backColor);
    lineEditor->setPalette(pal);
1 голос
/ 26 июля 2009

Создайте синюю палитру независимо от фактического виджета:

comboBox->setPalette( QPalette( Qt::blue ) );
0 голосов
/ 16 мая 2019

Раньше у меня не работали ответы, но я собрал все ответы и, наконец, работал над Qt 5.12 :

QPalette pal = ui.widget->palette();
pal.setColor(QPalette::Base, Qt::red);
ui.widget->setPalette(pal);
0 голосов
/ 15 января 2011
comboBox->setPalette( QPalette( Qt::blue ) );

У меня отлично работает!

0 голосов
/ 07 октября 2008

Я бы попробовал что-то вроде

QPalette pal = widget.palette();
pal.setColor(QPalette::Window, Qt::blue);
widget.setPalette(pal);
...