2

我正在开发一个需要较深调色板的 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 时修改禁用小部件的调色板颜色的正确方法是什么?

4

1 回答 1

2

据我所知,设置 Fusion 样式调色板qtquickcontrols2.conf不会更新默认Q[Gui]Application调色板。但相反的工作 - 默认Controls2调色板是系统范围的默认值QPalette,可以使用Q[Gui]Application::setPalette(). 因此,您可以在 C++ 代码中设置所有颜色组,就像您现在为Disabled组所做的那样。

查看相关代码,您还可以在(例如)中指定一个Disabled子组。我不确定在哪个版本的 Qt 中可用,我也没有在任何地方看到这个文档。qtquickcontrols2.confFusion/Palette/Disabled

添加:看起来Palette和子组是从 conf 文件中读取的,至少从Qt 5.10开始(这也是引入Control::palette属性的时候)。

于 2019-06-21T22:51:43.113 回答