问题标签 [qqmlengine]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
879 浏览

qt - 更改 QML 对象的 QQmlContext?

显然,即使对象从现有的父级分离并附加到新的父级,当旧的父级上下文被销毁时,对象也是如此。

想到的第一个解决方案是在持久上下文中创建对象。但是,动态范围属性将不适用于它。这对我的用例至关重要。如果对象不在它的父对象的上下文中,并且父对象发生更改,我将无法运行。此外,即使目标对象具有函数,也不能再调用函数,因为 QML attempted to evaluate a function in an invalid context.

试图诉诸QQmlEngine::setContextForObject()QQmlEngine::contextForObject()只是发现一旦设置,上下文就无法重置。

那么,有什么新鲜想法吗?

0 投票
1 回答
1321 浏览

qt - 如何最正确/有效地刷新来源已更改的项目?

我从文件系统中加载了一个已更改的 qml 文件,但是由于第一次加载它,它也被缓存,即使Loader通过将源组件设置为“重置”它也不会刷新undefined

之前也有人问过类似的问题,但是出于以下几个原因,我想更进一步:

  • 那里接受的回答建议engine->trimComponentCache()不幸的是使用它只工作一次然后停止,没有进一步的更新反映
  • 在下面的评论中,OP 建议engine->clearComponentCache()每次都有效,而且确实有效。然而,这个方法的文档让我对它的用法有点不安:

此函数会导致引擎先前加载的所有组件的属性元数据被销毁。所有先前加载的组件以及从这些组件创建的所有现存对象的属性绑定都 将停止运行

这听起来很不祥,尤其是粗体部分,因为我没有重新加载我的整个应用程序,它只是一个相当大的应用程序的一小部分,它需要保持完整,同时刷新那个特定的外部 qml 文件反映其变化。

第二部分你听起来更有希望:

此函数将引擎返回到不包含任何加载的组件数据的状态。这对于重新加载先前组件集的较小子集或加载先前加载的组件的新版本可能很有用。

清除组件缓存后,必须先加载组件,然后才能创建任何新对象。

所以它确实给人的印象是这个方法可以用来只重新加载一个子集而不会破坏现有的代码。然而,即使是这样,也需要大量额外的工作来为新实例化的对象重建所有缓存,而不是简单地为更改的特定 qml 源清理缓存。

此外,我一直在考虑一个更复杂的解决方案,包括创建一个自定义 QML 元素,它本质上是一个围绕一个全新 QML 引擎的包装器,它呈现给 FBO 并将输出显示为我的“主”中的一个对象发动机,从而完全隔离两个发动机。但是,我并不热衷于做所有额外的工作,并引入另一个完整运行引擎的开销。

那么有什么想法吗?

0 投票
1 回答
289 浏览

qt - 在第二个窗口上渲染 QQuickItem 而不更改其父层次结构

我必须将QQuickItem特定窗口所拥有的渲染到另一个窗口中。基本上MyQQuickItem归window1所有,在window2上渲染。由于某些功能,此切换必须在我的应用程序中反复发生。

我做了以下来实现目标&代码基本上工作正常

代码:

问题:
上述技术在功能上工作正常。但这需要我在将父项从 window1 设置为 window2 并再次返回之间折腾几次。

问题:
还有其他方法MyQQuickItem可以在 2 个窗口之间共享吗?或者是否可以MyQQuickItem在两个窗口上交替显示而无需更改父层次结构

0 投票
1 回答
2274 浏览

qt - 如何找出单例对象的 QQmlEngine 实例?

我有一个SingletonBaseClass在 C++ 中定义并随后在 QML 中扩展的类。在 qmldir 文件中,它被标记为 Singleton:

这是基类:

  1. 如何QQmlEngine在 SingletonBaseClass 中检索实例?
  2. 如何从静态函数中获取指向我的单例实例的指针?

注意:我的应用程序中有多个 QML 引擎实例。

[更新]:我对建议的解决方法不满意,所以我最终为 1.贡献了这个补丁,为 2. 贡献了QQmlEngine::singletonInstance()。这两个更改都将在 Qt 5.12 中可用。

0 投票
1 回答
126 浏览

qt - QtQuick 的 ListView 无法获得 QAbstractItemModel 对象的所有权

根据 Qt文档,每当QObject指针类型通过Q_INVOKABLE方法从 C++ 代码传递到 QML 时,都有一组规则确定谁负责该指针的生命周期。如果QObject是无父对象,则 QML 引擎隐含地负责获取指针的所有权。

在我的场景中,我希望我的前端 UI 表示由后端 C++ 代码生成/提供的列表模型。我的假设是,只要 QML 代码引用它,指针就会保持活动状态。下面的代码显示了精简的测试用例:

主文件

主.qml

这是程序的截图:

用户单击按钮的那一刻,垃圾收集器运行并销毁模型 ptr(通过标准输出中的“创建”和“销毁”输出可以看出销毁)。

我很想知道为什么指针被破坏了?我注意到它没有将ListView设置为其父级,这很公平,我认为 QML 引擎会使用某种形式的引用指针来尝试跟踪谁仍然持有对它的引用。是否有文档可以更深入地了解垃圾收集/所有权的实施方式。

同样,是否有更好的方法来构建此代码,同时仍满足将无父QObject传递回 QML 的要求。

0 投票
2 回答
122 浏览

c++ - 从 C++ 调用的 QML 函数无法更新元素

我正在从 C++ 调用 QML 函数。问题是 QML 函数在从 C++ 调用时无法更新 QML 元素。下面是代码:

main.qml

main.cpp

文本框元素只是一个常规文本,其中的文本仍然是“无”,而不是预期的“Hello from C++”。

有关如何解决此问题或成功将参数从 C++ 传递到 QML 的任何想法?

0 投票
1 回答
66 浏览

qml - FileDialog(QtQuick Object)中实例化一个c++类,报错:Cannot assign object to property

代码:

我很好地编译代码并运行,然后得到如下错误:

QML 调试已启用。只能在安全的环境中使用。(爬取:这是另一个问题,您可以忽略)

QQmlApplicationEngine 加载组件失败

qrc:/main.qml:22 无法将对象分配给属性

而另一个组件,如PageWindowButton,可以实例化 C++ 类。怎么了?

0 投票
0 回答
79 浏览

c++ - 在 qml js 函数中实例化 c++ 结构

如何从 c++ 结构初始化一个对象并将它们发送到 c++ 类,如下所示:

在上面的代码中,我们从 sRange 创建和实例化,并在 c++ 类中设置为 newRange 方法。但是我们不能从 sRange struct tnx 实例化对象

0 投票
2 回答
168 浏览

c++ - 如何从 qml 访问 qabstractlistmodel 派生类对象作为另一个类的属性?

我正在设计一个包含 3 个列表的 qml 页面。我希望数据作为来自 cpp 的模型显示在这些列表中。我可以将所有这 3 个模型作为单个类的属性吗?

我有一个从 qabstractlistmodel 派生的类用作模型。我希望这个模型作为另一个类的属性,它使用 qqmlcontextproperty 绑定到 qml。

IE。我可以将这个模型作为一个属性来访问。

它显示错误:

Unable to handle unregistered datatype 'ToDoModel' for property 'HelperClass::todoModel'

0 投票
1 回答
114 浏览

c++ - 如何将 QML 实例化项目设置为 QImageProvider

我有一个继承QQuickItem和的类QQuickImageProvider。这个类是从 qml 实例化的。我需要打电话QQmlEngine::addImageProvider,这样这个类才能真正提供图像。如this question中所述,我应该能够获得我的对象所在的引擎。在我正在调用的类的构造函数中

QQmlEngine::contextForObject(this);总是返回一个空指针。为什么这不起作用?