我正在尝试在C ++中创建QML组件(按组件,我指的是Component
的{{1}}属性使用的Loader
类型的QML组件)类并将其传递给QML文件。我正在使用sourceComponent
来基于用户与该视图其他位置的UI的交互来动态更改视图的单个区域。这是我实施的方式:
Loader
DynamicLoader.h
class DynamicLoader: public QQuickItem {
Q_OBJECT
Q_PROPERTY(QObject *mainComp READ getMainComp NOTIFY mainCompChanged)
public:
DynamicLoader(QQuickItem *parent = Q_NULLPTR);
QObject* getMainComp() const;
private:
QObject* m_mainComp;
QObject* createComponent();
signals:
void mainCompChanged();
};
DynamicLoader.cpp
DynamicLoader::DynamicLoader(QQuickItem* parent)
: QQuickItem(parent)
, m_mainComp(new QObject(this)) {
m_mainComp = createCustomComponent();
}
QObject *DynamicLoader::getMainComp() const {
return m_mainComp;
}
QObject* DynamicLoader::createComponent() {
QQmlEngine engine;
QQmlComponent component(&engine,
QUrl::fromLocalFile("://imports/components/CustomComponent.qml"));
QObject* object = component.create();
Q_ASSERT(object);
QQuickItem* childItem = qobject_cast<QQuickItem*>(object);
childItem->setParent(this);
return childItem;
}
CustomComponent.qml
Component {
CustomTextBox {
text: "Custom Text"
}
}
CustomTextBox.qml
但是,这会使程序崩溃,并显示以下错误消息:
import QtQuick 2.0
Item {
property int containerWidth: 580
property alias text: customText.text
anchors.fill: parent
Text {
id: customText
text: "Default Text"
anchors.top: parent.top
anchors.horizontalCenter: parent.horizontalCenter
width: parent.width
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
font.weight: Font.Bold
font.pointSize: 100
color: "white"
}
}
,并在QQmlComponent: Component is not ready
处失败。
即使将Q_ASSERT
更改为简单的CustomComponent.qml
,也会发生相同的错误。当我发现此问题时,我怀疑Component {}
可能已经用QQmlComponent
类型包装了QML文件(如果我输入错了,请更正),所以我继续将文件转换为:
Component
并遇到相同的错误。
只有当我将文件更改为以下文件时,它才不会出错:
Item {
CustomTextBox {
text: "Custom Text"
}
}
最后,当我完全在QML中实现Item {
Item {
}
}
时,不会发生错误。
我是否正确地认为声明QQmlComponent已经包装了CustomComponent.qml
类型的QML文件?如果没有,我应该如何在C ++中创建一个Component
QML组件?
为什么在创建嵌套的自定义组件时程序崩溃?我是否需要通过其他方式创建组件?
任何对基本误解的帮助和纠正将不胜感激。谢谢。