问题标签 [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 投票
1 回答
348 浏览

c++ - Qt Quick - 如何在 qml 接口中使用从 QQuickPaintedItem 继承的 c++ 类?

我是 Qt 5.13.0 的新手。在 Visual Studio 2019 项目中,我需要在 qml 界面中显示从 QQuickPaintedItem 类继承的自定义绘制项。自定义项写在一个名为 WQTMessageItem 的 c++ 类中,声明如下:

在 c++ 方面,我试图以这种方式向 qml 引擎声明上述类:

最后,我尝试在 qml 文件中声明的 ListView 中使用上述自定义项,这样:

不幸的是,这不起作用。我的应用程序编译并链接,但在运行时立即关闭,并显示以下错误消息:

我试图自己找到解决方案,但没有成功。有人可以解释一下我应该如何修改上面的代码以使其正常工作吗?

0 投票
1 回答
558 浏览

c++ - 在 Qt C++ 单元测试中动态加载 QQuickWindow 而不是 QQuickWidget

在我们的项目中,我们对 QML 源代码进行了 C++ 单元测试。它使用以下代码动态加载组件以进行进一步处理

对于像这样的 qml 组件工作正常:

我的.qml:

但是,当我将组件包装到Dialog

它停止工作:

错误: QQuickWidget仅支持加载从QQuickItem.

这是预期DialogQQuickWindow。但是尝试像这样加载QQuickItemhttps://doc.qt.io/qt-5/qquickview.html#details QQuickView

也因上述错误而失败。QQmlApplicationEngine并通过这里加载https://stackoverflow.com/a/23936741/630169

失败并出现另一个错误:

QQmlApplicationEngine未能加载组件
QWARN:未安装模块“” QWARN:未MyTest::myMethodTest()安装 模块“ ” ...mynamespace.mymodule
MyTest::myMethodTest()mynamespace.mymodule

为什么为itemview->setSource()正确加载此模块而无法为同一 item qml 源执行但包装到?RectangleQQmlApplicationEngineDialog

注意:这些模块是 C++ 并且可以很好地加载view->setSource().

如果我尝试通过QQmlComponent文档中提到的方式使用和加载:https ://doc.qt.io/qt-5/qqmlcomponent.html#details :

  • 然后有另一个错误:

    QQmlComponent: 组件没有准备好

ifengine->addImportPath()没有被调用,并崩溃

位置:[未知文件(0)]

engine->addImportPath()调用时出错。

如何正确加载Dialog( QQuickWindow) 并在 C++ 中获取 rootQQuickItem以进行测试?有任何想法吗?谢谢!

0 投票
1 回答
301 浏览

qt - 使用来自 C++ 的信号更新 QML 上的 MapCircle

我正在尝试从 C++ 中的信号更新 QML 中的 MapCircle,但我整天都遇到了几个问题。

在我的课堂上,我有一个Q_PROPERTY只读的,它保存了 4 个无人机的 GPS 位置QVariantList

然后我将函数定义为:

在我的主要功能中,我连接triggerPosition到一个计时器以便定期更新位置

但是,当我运行我的程序时,会有一点延迟,我mouseArea变得无法使用并且程序崩溃了。当我尝试打印经度以查看它是否更新时,初始值会多次打印到终端,但随后程序崩溃并且MapCircle地图上不存在

My Qml 文件的相关部分如下所示:

有人可以在这里指出我正确的方向吗?

0 投票
1 回答
316 浏览

qt - QQmlApplicationEngine 没有完全卸载 qml 组件

我目前正在使用 QQmlApplicationEngine 加载我的 main.qml 并且工作正常,然后我想切换到 main2.qml(不调用我的 QQmlApplicationEngine 上的 quit() ,因为这会触发 QCoreApplication::exit() 它将退出我的应用程序)。所以我只是删除我的引擎,创建一个新引擎并再次设置上下文属性(main.qml 的不同上下文属性略有不同),并且加载正常。然后我切换回 main.qml(再次加载 main.qml),我开始收到类似的警告

该特定属性在 main.qml 的上下文中为空,因此这是正确的,但在 main2.qml 的上下文中它不是空的。但我的问题是为什么我第一次加载 main.qml 时没有收到警告?如果在加载 main2.qml 后加载 main.qml,我似乎只会收到警告。

感谢您的帮助。

编辑:这是一个简单的示例代码

0 投票
1 回答
770 浏览

c++ - 使用 CMake 创建 QML 插件

我正在尝试使用 CMake 创建简单的 QML C++ 插件。有我的消息来源:

CMakeLists.txt

主.cpp

假人.h:

myplugin.h:

main.qml:

我还在我的构建目录中创建了名为MyPlugin的目录,其中包含指向构建的 libdummy.so 和qmldir 文件的链接,如下所示:

项目构建,但是当我运行它时,我收到一个错误:

我的函数的调试输出registerTypes没有被调用(stdout 上没有输出),所以我假设由于某些原因没有注册类型。如果我尝试通过将此行添加到myplugin.cpp来静态注册类型:

,我得到一个错误:

我在这个插件中有什么问题以及如何使它与 CMake 一起工作?

0 投票
1 回答
105 浏览

c++ - 在 qml 中处理页面

我刚刚开始学习 Qml。Altought 我读了太多的 qt 教程,仍然在为一些问题苦苦挣扎。我想使用 OpenGL 制作多页桌面应用程序。首先,在程序的主要功能中,我正在传输类实例,以便我可以使用下面的代码片段在 qml 中访问它们。

但是如果我必须实例化我想在 qml 中使用的所有类,这意味着 main 函数中将有一百个实例。我认为必须有更合适的方法来做到这一点。

其次,如果我们使用 qmlRegisterType 注册对象并导入到 qml 文件中,我可以在活动 qml 更改后访问 bar 类的属性吗?因为据我所知,bar 类的对象是在加载相应的 qml 时创建的。

项目.cpp

GLWindow.qml

GlWindow2.qml

酒吧.h

bar2.h

我在 GlWindow.qml 上绘制了产品的内容,然后关闭了这个 qml 并显示了 GlWindow2.qml。我的问题从这里开始,如何将产品内容传输到product2?

0 投票
0 回答
271 浏览

qt - Qt - QQuickView(), setSource 不冻结 GUI

尝试解决问题很久,没有成功,QT版本5.15.0。MinGW 8.1.0, 64 位

该问题似乎仅在 QML 文件中加载地图插件时发生,下面是代码的片段调用 qmlView->setSource(QUrl("qrc:/maps/map.qml")); 等待至少 2 秒,然后 GUI 冻结。基本上 GUI 线程被阻塞了 2 秒。我试图在一个单独的线程中调用 qmlView->setSource(QUrl("qrc:/maps/map.qml")) 但崩溃了,不太确定 Loader QML 类型是否可以工作,因为它是相同的 GUI 线程。

我什至尝试了https://doc.qt.io/qt-5/qtlocation-mapviewer-example.html的示例,当您更改提供程序时,主 GUI 也会冻结

有没有办法在 GUI 不冻结的情况下加载 QML 文件?谢谢

QML 文件是

从 JarMan 输入后,我尝试使用 QML Loader,见下文,但 GUI 仍然冻结

0 投票
1 回答
138 浏览

qt - QML 属性依赖是如何确定的?(以及如何操作它们)

当表达式中的某些内容发生更改时,将更新绑定到表达式的属性。这称为依赖项

编辑:

澄清:

  • 我对 Qt 如何确定依赖项列表的详细信息感兴趣
  • 对简单绑定的依赖,例如x: y或多或少明显
  • x: myItemId["y"]问题是关于不太明显的情况,例如在x: myFunction(z)哪里myFunction(p) { if (p) return myItemId.y }

有时,即使表达式是不带参数的函数调用,QML 引擎也能够检测到更改,有时它不能这样做(例如 mapToItem(item,0,0).x)。

另一个不完美的例子是,在不重新分配数组本身的情况下设置 JS 数组项值通常不会产生 onXxxxxChanged 信号或更新任何引用该数组值的内容。

x: {myForcedDependency; return myActualCalculation()}有时建议使用具有未使用结果 () 的表达式来强制依赖

根据这篇 KDAB 文章Qt 源代码,绑定表达式不仅被评估,而且在此期间“访问”的任何属性都被“捕获”在称为“守卫”的东西中,然后每个守卫属性 onXxxxxChanged() 信号被连接,但实际这个过程的细节尚不清楚。

所以我的问题是:

  • 是否有任何定义的依赖解析规则?

  • 它是如何工作的?

    • QQmlEngine/V8 扫描“访问”到绑定表达式调用的函数的深度有多深,什么可能阻止它这样做?
    • 依赖检测是否仅基于属性解析的第一次尝试?
    • 即使执行从未到达那里,是否检查了所有可能的代码路径?
      • 在这些情况下是否确定了非平凡的访问,例如 object["property"] 语法?
      • 如果某些未执行的代码(当前)是错误的(并且不会产生错误但无法正确分析)怎么办?
  • 如何影响依赖关系解决过程?

    • 有没有办法避免或阻止依赖?
      • 据我了解,只有在需要更新时才真正改变其值的中间“过滤器”属性是预期的方式,对吗?
    • 是否有强制依赖的预期方法?
      • 手动发出“XxxxxChanged”信号是强制更新的正确/支持方式吗?
      • 添加未使用的引用是一种合法/有意的方式,还是基于当前实现怪癖的未定义行为?

任何信息都会很有用,尽管我确实阅读了有关 QML 属性、QML 绑定和 JavaScript 表达式的官方文档,但没有找到任何具体解释 - 如果您参考官方文档,请引用相关部分。

请注意,我并不是要您测试其中任何一个是否适用于您的系统,而是要测试它是否应该有效 - 是否可以依赖它

0 投票
0 回答
77 浏览

c++ - 检测到属性“前景”的绑定循环

我的应用程序在 Ubuntu 操作系统中运行良好。但是当我尝试使用 Boot2Qt 在 Yocto 中运行它时,它会抛出以下错误消息:

这是我的代码的一个spinet,它引发了这个错误。

这是我得到的结果:讨厌的应用程序响应:
讨厌的应用程序响应

试图弄清楚发生了什么。我已经这样做了:

现在结束,我得到这个:也许材料有问题?:
可能是材质问题?

0 投票
1 回答
39 浏览

c++ - 由于对象所有权问题,QT/QML 应用程序崩溃

我有一个使用静态 Qt C++ 库的 Qt/Qml 应用程序。类(模型等)驻留在库中,其对象在应用程序的 main.cpp 或 QML 文件中创建。一些类是从 QObject 派生的。关闭具有这些类的对象的屏幕时出现分段错误。即使在关闭屏幕后,我也需要维护对象。

我尝试过使用 QQmlEngine::setObjectOwnership()。我不能在这些类的构造函数中使用它,因为 QQmlEngine 类不适用于库项目。所以我在创建对象后在应用程序中设置它。

在 Qml

这里 getDbpointObject() 是一个槽,返回一个从 QObject 派生的类的对象。

然后我将对象传递给内部类的函数以设置其所有权。

在此处输入图像描述

在某些示例中,可以看到在创建对象后设置所有权是可以的。不确定它是否正确,或者我们必须在构造函数中这样做,我没有办法?