用于禁用小部件的 QtQuick 调色板

标签 qt qt5 qtquick2 qtquickcontrols2 qqmlapplicationengine

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

最佳答案

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

查看relevant code ,看起来您还可以在 qtquickcontrols2.conf 中指定 Disabled 子组(例如 Fusion/Palette/Disabled)。我不确定 Qt 的哪些版本可用,也没有在任何地方看到此记录。

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

关于用于禁用小部件的 QtQuick 调色板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56667864/

相关文章:

c++ - 运行 Qt hello world 时进程退出代码 0xC0000135

c++ - 模块项中的 QQmlComponent

qt - 如何使用 Qt Quick Controls 显示消息框?

c++ - Qt:QScrollArea 中的自定义小部件

c++ - QComboBox 文本颜色没有按预期更改

c++ - 通过单击内部小部件而不是标题栏来移动窗口

python - 如何更改 QTableWidget 单元格中 float 的精度?

c++ - QImage:如何将灰度图像转换为 RGB 热图

image - 如何在 Qt 5 中保存灰度图像

c++ - QML QWidget 容器