0

我正在尝试实现自己的风格,为此我想覆盖内置对象。这就是我正在做的事情:

// 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>

根据文档,我相信这应该使用文件选择器自动工作。

但是,我的应用程序在启动时挂起。我的猜测是我陷入了递归导入。我该如何正确地做到这一点?

4

2 回答 2

4

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,而只是导入文件夹。这就是我们所说的“定制Qt Quick Controls 2 ”。

于 2017-04-06T16:46:15.740 回答
0
  1. 必须在加载导入 Qt Quick Controls 的 QML 之前配置样式。注册 QML 类型后无法更改样式。设置样式()

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

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

请参阅:创建自定义样式

于 2017-04-06T14:01:14.983 回答