我用的是Windows 10桌面系统。我想知道为什么我在QML系统调色板中找不到颜色,我看到QML默认按钮快速控件正在使用。
按钮出现在
- # e1e1e2正常
- # e4f0f9强调
- # cce4f7按
但是我在活动/非活动/禁用SystemPalette部分中找不到任何这些。在SystemPalette中,"button"的颜色是#f0f0f0,更接近的颜色是"midlight",颜色是#e3e3e3,而唯一带蓝色的东西是"highlight",颜色是#0078d7。
它们是否以某种方式混合在一起?
更新:
也许重要的信息缺失:我正在使用按钮从QtQuick。1.4控制。
如果我有一个从2.0看它不显示颜色从系统调色板-但也许这不能预期,因为没有预先构建原生风格的Qt快速控制2?
更新:
澄清。这是一个出于好奇的问题。没有严重的问题。我只是想知道是否有一个bug在QML SystemPalette,或者甚至怀疑它的有用性。它是不太正确的常数的累加吗?
我也有和你一样的问题,不幸的是,我很好奇,想深入研究源代码,看看他们是如何做到的。对于其他有同样问题的人来说,很难创建具有与内置控件相同风格灵活性的自己的控件。即使您费心去做(我就是这么做的),它也不容易分发,因为您必须在运行时将QML文件注册到一个名称空间中。最后,不需要为此烦恼,只需上传控件的副本,就像人们在其他GUI框架中所做的那样。整个过程的文档记录很差,特别是对于那些希望以. qml文件开始和结束的人。
从他们的工具栏中截取一个片段。qml实现:
import QtQuick.Templates 2.2 as T
import QtQuick.Controls.Material 2.2
//...
background: Rectangle {
implicitHeight: 48
color: control.Material.toolBarColor
//...
}
简而言之,他们实现了每个默认控件三次,并根据QQuickStyle的特定设置在它们之间切换。
在qquickstyle.cpp中,下面发生的大部分内容都在QQuickStyleSpec::Resolve()函数中。这将QQuickStyleSpec::style字符串设置为安装目录中的一个文件夹,如果您选择将样式设置为内置选项之一的话。一个示例文件夹路径可能是:C: Qt 5.9 mingw53_32 qml QtQuick 控制。2表示"默认",或C: Qt 5.9 mingw53_32 qml QtQuick 控制。2Material for "Material".
该路径最终被传递给QtQuickControls2Plugin::registerTypes(),其中QQuickStyleSelector.select()将相对路径转换为绝对路径,并对我们想要注册的QML文件执行分支搜索。有了绝对路径uri (QtQuick.Controls)和我们想要的任何版本号,我们现在可以在uri下注册QML文件,如下所示:
qmlRegisterType(QUrl("file:///C:/absolute/file/path/FancyControl.qml"), "QtQuick.Controls", 2, 1, "FancyControl");
为方便起见,我将函数调用分解为常量字面量,以便您确切地知道发生了什么。请注意,实际上不可能在"QtQuick"下注册。控件",因为函数声明特定的名称空间已经注册。不管那是什么意思
这些都是在运行时发生的,这使得分发这些东西变得更加困难——你必须编写一个库来简化注册。
我想他们这样做的原因是因为每种风格都有很大的不同。材质设计要复杂得多,需要使用OpenGL着色器,以及其他特定于材质设计的其他设置。因此,为了提供一种错觉,即具有完全不同底层内容的多种风格是一个控件,他们必须别无选择,只能使用. qml文件玩弹珠机。一种对简单界面的扭曲。
我的建议是忘记这一切的存在,并分发您的控件的最低限度的有效副本,就像人们在所有其他GUI框架中所做的那样。
大多数QtQuick 2控件都有一个palette
属性,您可以在其中配置当前项及其子项的颜色。这里,我为Page
设置了palette
, Button
继承了它:
import QtQuick
import QtQuick.Controls
Page {
palette.button: "lightsteelblue"
palette.buttonText: "purple"
palette.mid: "orange"
Button {
text: "Hello"
}
}
你可以在网上试试!