Как установить цвет фона виджета, например, поля со списком или двойное вращение?

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

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

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

8 ответов

Решение

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

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

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

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

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

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

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

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

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

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

QPalette pal = myComboBox->palette();
pal.setColor(QPalette::Base, pal.color(QPalette::Window));
myComboBox->setPalette(pal);

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

Хотя предыдущие ответы могут установить цвет фона для нередактируемого 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);

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

comboBox->setPalette( QPalette( Qt::blue ) );

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

QPalette pal = ui.widget->palette();
pal.setColor(QPalette::Base, Qt::red);
ui.widget->setPalette(pal);

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

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

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

Другие вопросы по тегам