多个 QQuickWidgets 与一个 QQmlEngine

Posted

技术标签:

【中文标题】多个 QQuickWidgets 与一个 QQmlEngine【英文标题】:Multiple QQuickWidgets with one QQmlEngine 【发布时间】:2015-03-23 16:38:01 【问题描述】:

我有一个问题,希望你能帮助我。

我有多个 QQmlWidgets,应该显示相同组件的不同实例。 组件是在运行时创建的,并使用其父小部件的特定属性。 问题是,这些组件中有多个嵌套项,因此它们的加载速度非常慢。 我决定在应用程序预加载阶段将它们全部加载到 QQmlEngine,并在必要时创建它们。 所以我所有的 QQmlWidgets 都有相同的 QQmlEngine 和相同的根上下文。 为了不同小部件的不同属性,我在单独的上下文中创建组件的每个实例(每个 QQmlWidget 一个)。 创建后,我将新创建对象的父项设置为 QQmlWidget 的根项; 问题是根项在动态创建的对象中被引用,他们找不到它。 你能提出任何解决方案吗?我在下面发布了我的代码的简化版本。

// main.cpp
QQmlEngine* e = new QQmlEngine;
QWidget* ww1 = new QWidget;
QWidget* ww2 = new QWidget;

QQuickWidget* w1 = new QQuickWidget(e, ww1);
QQuickWidget* w2 = new QQuickWidget(e, ww2);
w1->setSource(QUrl::fromLocalFile("main.qml"));
w2->setSource(QUrl::fromLocalFile("main.qml"));

QQmlComponent* comp = new QQmlComponent(e, "comp.qml");
QQmlContext* c1 = new QQmlContext(e);
QQmlContext* c2 = new QQmlContext(e);

QQuickItem* it1 = qobject_cast<QQuickItem*>(comp->create(c1));
it1->setParentItem(w1->rootObject());
QQuickItem* it2 = qobject_cast<QQuickItem*>(comp->create(c2));
it2->setParentItem(w2->rootObject());
ww1->show();
ww2->show();


//main.qml

Rectangle 
  id: root


//comp.qml

Rectangle 
  anchors.top : root.top

错误:

comp.qml - ReferenceError: root is not defined

提前致谢。

【问题讨论】:

你考虑过从 QML 创建 QQuickWidgets 吗? 【参考方案1】:

当一个组件被加载时,一个父组件没有被设置,它只有在调用setParentItem 方法后才会被设置。可以通过在父级更改时设置锚来修复。

// comp.qml
Rectangle 
    onParentChanged:  anchors.top = parent.top; 

【讨论】:

谢谢,这适用于我的简化案例,但不适用于实际引用是在 comp.qml 层次结构中非常深的组件中完成的实际引用,并且可能具有不同的深度。 也可以通过调用beginCreate()、setParentItem()和finishCreate()来完成同样的事情,在我的情况下,我希望能够通过id而不是通过调用parent来引用它们,这实际上是组件本身的参数。

以上是关于多个 QQuickWidgets 与一个 QQmlEngine的主要内容,如果未能解决你的问题,请参考以下文章

多个视图与多个片段

模型中的多个图与一个大的.EDMX与多个.EDMX

同一列表中的多个 ForEach 与具有一个 ForEach 的多个列表

Fastlane 与多个团队的多个捆绑 ID 匹配

一个实体可以与另一个实体有多个关系吗?

SQL 2012 将来自多个表的多个查询与连接和计数合并到一个表中