Qt использовать цвет палитры в таблице стилей

В qt вы обычно устанавливаете цвет QWidget с помощью QPalette.

Пример:

QPalette palette = new QPalette();
palette.setBrush(QPalette::Base, this->palette().backgorund());

QLineEdit *line = new QLineEdit();
line->setPalette(palette);

Теперь у меня небольшая проблема. Невозможно изменить цвет границы QLineEdit с помощью QPalette. Это означает, что я должен использовать QStyleSheet.

Пример:

QLineEdit *line = new QLineEdit();
line.setStyleSheet("border: 1px solid green");

Но теперь я не могу установить базовый цвет QLineEdit с QPalette, потому что цвет фона QLineEdit больше не связан с QPalette::base. Это означает, что следующий код не изменит background-color QLineEdit:

QPalette palette = new QPalette();
palette.setBrush(QPalette::Base, this->palette().backgorund());

QLineEdit *line = new QLineEdit();
line->setPalette(palette);
line->setStyleSheet("border: 1px solid green");

Но невозможно определить background-color QLineEdit в таблице стилей, потому что background-color QLineEdit должны быть динамическими.

Мой вопрос: как связать фоновый цвет QLineEdit с QPalette::base, чтобы определить background-color QLineEdit динамически с QPalette?


person NelDav    schedule 17.08.2018    source источник
comment
Почему вы не можете просто создать / отформатировать QString, содержащий необходимые значения фона и границ?   -  person G.M.    schedule 17.08.2018
comment
Я не знаю, что ты имеешь в виду. Вы имеете в виду, что я должен создать класс, унаследованный от QString, с полем для фона и полем для границы? - В QString нет фона и границ, не так ли?   -  person NelDav    schedule 17.08.2018


Ответы (3)


Просто создайте требуемый QString во время выполнения ...

auto style_sheet = QString("border: 1px solid green;"
                           "background-color: #%1;")
  .arg(QPalette().color(QPalette::Base).rgba(), 0, 16);

Вышеупомянутое должно привести к QString, например ...

border: 1px solid green;
background-color: #ffffffff;

Потом...

line->setStyleSheet(style_sheet);
person G.M.    schedule 17.08.2018
comment
Ах, конечно, теперь я понимаю, о чем вы. Это простая и отличная идея. - Спасибо! - person NelDav; 17.08.2018

Альтернативно:

line->setStyleSheet(QStringLiteral(
    "border: 1px solid green;"
    "background-color: palette(base);"
));

Ссылка: http://doc.qt.io/qt-5/stylesheet-reference.html#paletterole

Использование PaletteRole также позволяет CSS быть в отдельном файле / источнике.

person Maxim Paperno    schedule 30.01.2019
comment
Это должен быть правильный ответ. Принятый в настоящее время ответ больше похож на создание таблицы стилей с цветами, скопированными из объекта палитры. Это (по моему мнению) довольно далеко от того, как поставлен вопрос (и того, что я тоже хочу сделать). При этом я не могу заставить это работать (все мои цвета получаются черными). Кто-нибудь знает где-нибудь рабочий пример? Я не нашел ... :( - person pythonator; 16.05.2019
comment
Небольшая коррекция, цвета не получаются черными, но цвета палитры, которые я установил, похоже, игнорируются, и я получаю палитру по умолчанию ... - person pythonator; 16.05.2019
comment
@pythonator При использовании CSS в виджете палитра по умолчанию или назначенная виджету палитра может игнорироваться (особенно в случаях или в фонах / границах / фреймах). В таких случаях PaletteRole, кажется, лучше всего использовать при обращении к приложению по умолчанию QPalette (необязательно устанавливается с помощью QApplication :: setPalette () `). Точное поведение, и особенно то, как цвета палитры распространяются (или нет), может зависеть от используемого стиля Qt (например, слияние или окна и т. Д.). Fusion является наиболее гибким и предсказуемым с точки зрения наследования QPalette, а также его смешивания с CSS. - person Maxim Paperno; 17.05.2019

Я нашел выход из своей ситуации. Поскольку я хочу только замаскировать границу и не хочу ее раскрашивать, я могу использовать метод QLineEdit::setFrame(bool). Но что, если я хочу раскрасить рамку, как в моем примере выше? Я пока не нашел решения для этого. Я рад каждому ответу.

person NelDav    schedule 17.08.2018