Цветовая палитра QtQuick для отключенных виджетов - PullRequest
2 голосов
/ 19 июня 2019

Я работаю над приложением Qt (QML), которое требует более темной цветовой палитры.На основе некоторых примеров я создал файл qtquickcontrols2.conf со следующим содержимым:

[Controls]
Style=Fusion

[Fusion\Palette]
AlternateBase=#353535
Base=#191919
BrightText=red
Button=#353535
ButtonText=white
Highlight=#2a82da
HighlightedText=gray
Link=#2a82da
Text=white
ToolTipBase=white
ToolTipText=white
Window=#353535
WindowText=#dddddd

Цветовая палитра прекрасно работает в активном режиме виджетов.Однако отключенные виджеты выглядят точно так же, как и активные.Я не нашел способ добавить цвета для отключенных виджетов в файл конфигурации.Кажется, что это невозможно сделать.

Тогда у меня возникла идея создать более легкую версию активной палитры в главном приложении.

QPalette& updateDisabledColors(QPalette &palette)
{
    palette.setColor(QPalette::Disabled, QPalette::Window, palette.window().color().lighter());
    palette.setColor(QPalette::Disabled, QPalette::WindowText, palette.windowText().color().lighter());
    palette.setColor(QPalette::Disabled, QPalette::Base, palette.base().color().lighter());
    palette.setColor(QPalette::Disabled, QPalette::AlternateBase, palette.alternateBase().color().lighter());
    palette.setColor(QPalette::Disabled, QPalette::Text, palette.text().color().lighter());
    palette.setColor(QPalette::Disabled, QPalette::Button, palette.button().color().lighter());
    palette.setColor(QPalette::Disabled, QPalette::ButtonText, palette.buttonText().color().lighter());
    palette.setColor(QPalette::Disabled, QPalette::BrightText, palette.brightText().color().lighter());
    palette.setColor(QPalette::Disabled, QPalette::Link, palette.link().color().lighter());
    palette.setColor(QPalette::Disabled, QPalette::Highlight, palette.highlight().color().lighter());
    palette.setColor(QPalette::Disabled, QPalette::HighlightedText, palette.highlightedText().color().lighter());

    return palette;
}


int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QApplication app(argc, argv);

// Tried to change palette here also

    QQmlApplicationEngine engine;

    engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
    if (engine.rootObjects().isEmpty()) {
        return -1;
    }

    auto palette = app.palette();
    palette = updateDisabledColors(palette);
    app.setPalette(palette);

    return app.exec();
}

Палитра, полученная из app, являетсяне тот, который определен в qtquickcontrol2.conf.

Как правильно изменять цвета палитры для отключенных виджетов при использовании QML?

1 Ответ

1 голос
/ 22 июня 2019

Насколько я могу судить, установка палитры стиля Fusion в qtquickcontrols2.conf не обновляет палитру Q[Gui]Application по умолчанию. Но работает наоборот - палитра по умолчанию Controls2 является общесистемной по умолчанию QPalette, которую можно установить с помощью Q[Gui]Application::setPalette(). Таким образом, вы можете установить все цветовые группы в коде C ++, как вы делаете это сейчас только для группы Disabled.

Если посмотреть на соответствующий код , то, похоже, вы также можете указать подгруппу Disabled в qtquickcontrols2.conf (например, Fusion/Palette/Disabled). Я не уверен, в каких версиях Qt это доступно, и нигде не вижу этого документированного.

ДОБАВЛЕНО: Похоже, что Palette и подгруппы читаются из файла conf, по крайней мере, Qt 5.10 (что также было, когда было введено свойство Control :: palette ).

...