用于禁用小部件的 QtQuick 调色板
QtQuick colour palette for disabled widgets
我正在开发需要较暗调色板的 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
调色板是 system-wide 默认的 QPalette
,可以用 Q[Gui]Application::setPalette()
设置。因此,您可以在 C++ 代码中设置所有颜色组,就像您现在为 Disabled
组所做的那样。
查看 relevant code,您似乎也可以在 qtquickcontrols2.conf
中指定一个 Disabled
子组(例如 Fusion/Palette/Disabled
)。我不确定它在哪个版本的 Qt 中可用,也没有在任何地方看到它的文档。
已添加:看起来 Palette
和子组是从 conf 文件中读取的,因为至少引入了 Qt 5.10 (which is also when the Control::palette 属性。
我正在开发需要较暗调色板的 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
调色板是 system-wide 默认的 QPalette
,可以用 Q[Gui]Application::setPalette()
设置。因此,您可以在 C++ 代码中设置所有颜色组,就像您现在为 Disabled
组所做的那样。
查看 relevant code,您似乎也可以在 qtquickcontrols2.conf
中指定一个 Disabled
子组(例如 Fusion/Palette/Disabled
)。我不确定它在哪个版本的 Qt 中可用,也没有在任何地方看到它的文档。
已添加:看起来 Palette
和子组是从 conf 文件中读取的,因为至少引入了 Qt 5.10 (which is also when the Control::palette 属性。