如果不是QML SystemPalette,那么QML默认Button快速控件从哪里获得其颜色?



我用的是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"
    }
}

你可以在网上试试!

最新更新