【问题标题】:How do I create a Qml component from C++?如何从 C++ 创建 Qml 组件?
【发布时间】:2015-02-17 17:13:05
【问题描述】:

我尝试使用 QQmlComponent 组件(view.engine(), QUrl::fromLocalFile("MyItem.qml"));然后 QOObject *object = component.create();但它让我 Qml 组件没有准备好。进一步尝试将 statusChanged 信号连接到一个槽函数,但它似乎没有加载新的 qml 组件。

QQuickView view;
view.setSource(QUrl(QStringLiteral("qrc:/main.qml")));
QQmlComponent component(view.engine(), QUrl::fromLocalFile("MyItem.qml"));
QObject *object = component.create();
object->setParent(view.rootObject());
view.show()

【问题讨论】:

  • 贴出你试过的代码。
  • QQuickView 视图; view.setSource(QUrl(QStringLiteral("qrc:/main.qml"))); QObject *rootObj = view.rootObject(); QQmlComponent 组件(view.engine(), QUrl::fromLocalFile("MyItem.qml")); QObject *object = component.create();对象->setParent(view.rootObject()); view.show()
  • 我也尝试过在类的构造函数中创建一个类VViewerQml,_view.setSource(QUrl(QStringLiteral("qrc:/main.qml")));连接(&_view, SIGNAL(statusChanged(QQuickView::Status)), 这个, SLOT(onViewStatusChanged(QQuickView::Status))); _view.show();并在插槽中 onViewStatusChanged(QQuickView::Status status) {if (status) { QQmlComponent *c = new QQmlComponent(_view.engine(), QUrl::fromLocalFile("MyItem.qml")); QQuickItem *i = qobject_cast(c->create()); QQuickItem *i = qobject_cast(c->create()); // 添加 i 到 view.rootObject

标签: c++ qt qml


【解决方案1】:

如果您是从本地文件加载,则通过在构造函数中指定 QQmlComponent 来将其设置为同步加载:

QQmlComponent component(view.engine(),
                        QUrl::fromLocalFile("MyItem.qml"),
                        QQmlComponent::PreferSynchronous );

【讨论】:

  • 我尝试将QQmlComponent::PreferSynchronous 添加到构造函数,但它似乎不起作用。程序挂起并给我 QQmlComponent: 未准备好。问题与 onViewStatusChanged 的​​事实更加复杂,由 statusChanged 触发的插槽甚至没有被调用。
  • 程序挂起!?您的代码还有其他问题。您需要发布更多内容,包括MyItem.qml
  • MyItem.qml 导入 QtQuick 2.4 矩形 { 宽度:400 高度:362 文本 { 文本:“Hello World!” font.family: "Helvetica" font.pointSize: 24 color: "red" } TextEdit { width:50 height:60 x:50 y:200 } } 程序尝试为此 qml 创建一个组件,但由于 qqml组件尚未准备好,无法创建。
  • @CartikSharma 你似乎不明白,你有一个 tiny 的本地文件,你说QQmlComponent 在加载时挂起 - 这听起来难以置信.使用调试器单步执行代码,并准确找到它中断的行。我怀疑您的 QML 文件由于错误而无法加载,因此 createObject(..) 调用返回导致段错误的 nullptr。
  • 我通过调试器,程序到达行时崩溃,i->setParent(_view->rootObject());其中 i 是 QQuickItem, QQmlComponent *c = new QQmlComponent(_view->engine(), QUrl::fromLocalFile("MyItem.qml")); QQuickItem *i = qobject_cast(c->create());我应该设置什么? P.S 我也得到 QQmlComponent 没有准备好。
【解决方案2】:

Interacting with QML Objects from C++

从 C++ 加载 QML 对象

可以使用 QQmlComponent 或 QQuickView 加载 QML 文档。 QQmlComponent 将 QML 文档加载为 C++ 对象,然后可以从 C++ 代码修改该对象。 QQuickView 也是这样做的,但是由于 QQuickView 是 QWindow 的派生类,所以加载的对象也会被渲染成可视化显示; QQuickView 通常用于将可显示的 QML 对象集成到应用程序的用户界面中。

...

另外,更广泛的话题Integrating QML and C++

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 2015-01-23
    • 2012-01-09
    • 1970-01-01
    相关资源
    最近更新 更多