Как установить цвет фона виджета, например, поля со списком или двойное вращение?
Я пытаюсь установить цвет фона для двойного спин-бокса, и я не уверен, какую функцию мне следует использовать.
Я видел какую-то функцию под названием 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 ) );
У меня отлично работает!