覆盖时 Qt Quick Controls 2 挂起 Button.qml

Qt Quick Controls 2 hangs when overwriting Button.qml

我正在尝试 implement my own style 为此,我想覆盖内置对象。这是我正在做的事情:

// main.cpp
QQuickStyle::setStyle("mystyle");

// mystyle/Button.qml
import QtQuick 2.5
import QtQuick.Controls 2.1 as Controls

Controls.Button {
    background: Rectangle {
        color: "green"
    }
}

// qml.qrc
<RCC>
    <qresource prefix="/">
        <file>main.qml</file>
        <file>mystyle/CheckBox.qml</file>
    </qresource>
</RCC>

根据文档,我认为这应该会自动运行 using file selectors

但是,我的应用程序在启动时挂起。我的猜测是我陷入了递归导入。我该如何正确执行此操作?

  1. 必须在加载导入 Qt Quick 的 QML 之前配置样式 Controls.It 无法在注册 QML 类型后更改样式。 setStyle()

  2. 在自定义样式的 qml 文件中应用现有样式。

注意:推荐使用QQmlApplicationEngine,它内部会创建一个QQmlFileSelector实例。这就是使用 QML 文件选择器所需的全部内容。

参见:Creating Custom Styles

Qt Quick Controls 2 样式系统基于 QML 类型注册。当您 运行 您的应用具有 mystyle 时,该类型称为 QtQuick.Controls.Button IS mystyle/Button.qml。因此mystyle/Button.qml不能继承QtQuick.Controls.Button。它不能继承自己。

这与编写以下 C++ 基本相同:

// button.h
#include "button.h"
class Button : public Button {};

有点激进,但比喻通俗易懂。 :)

你能做的就是把(My)Button.qml放在某个地方,让它继承QtQuick.Controls.Button,不要把它注册成Qt Quick Controls 2,直接导入文件夹。这就是我们所说的“Customizing Qt Quick Controls 2”。