问题标签 [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.
c++ - Qt Quick - 如何在 qml 接口中使用从 QQuickPaintedItem 继承的 c++ 类?
我是 Qt 5.13.0 的新手。在 Visual Studio 2019 项目中,我需要在 qml 界面中显示从 QQuickPaintedItem 类继承的自定义绘制项。自定义项写在一个名为 WQTMessageItem 的 c++ 类中,声明如下:
在 c++ 方面,我试图以这种方式向 qml 引擎声明上述类:
最后,我尝试在 qml 文件中声明的 ListView 中使用上述自定义项,这样:
不幸的是,这不起作用。我的应用程序编译并链接,但在运行时立即关闭,并显示以下错误消息:
我试图自己找到解决方案,但没有成功。有人可以解释一下我应该如何修改上面的代码以使其正常工作吗?
c++ - 在 Qt C++ 单元测试中动态加载 QQuickWindow 而不是 QQuickWidget
在我们的项目中,我们对 QML 源代码进行了 C++ 单元测试。它使用以下代码动态加载组件以进行进一步处理
对于像这样的 qml 组件工作正常:
我的.qml:
但是,当我将组件包装到Dialog
它停止工作:
错误:
QQuickWidget
仅支持加载从QQuickItem
.
这是预期Dialog
的QQuickWindow
。但是尝试像这样加载QQuickItem
https://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 源执行但包装到?Rectangle
QQmlApplicationEngine
Dialog
注意:这些模块是 C++ 并且可以很好地加载
view->setSource()
.
如果我尝试通过QQmlComponent
文档中提到的方式使用和加载:https ://doc.qt.io/qt-5/qqmlcomponent.html#details :
- 然后有另一个错误:
QQmlComponent
: 组件没有准备好
ifengine->addImportPath()
没有被调用,并崩溃
位置:[未知文件(0)]
engine->addImportPath()
调用时出错。
如何正确加载Dialog
( QQuickWindow
) 并在 C++ 中获取 rootQQuickItem
以进行测试?有任何想法吗?谢谢!
qt - 使用来自 C++ 的信号更新 QML 上的 MapCircle
我正在尝试从 C++ 中的信号更新 QML 中的 MapCircle,但我整天都遇到了几个问题。
在我的课堂上,我有一个Q_PROPERTY
只读的,它保存了 4 个无人机的 GPS 位置QVariantList
然后我将函数定义为:
在我的主要功能中,我连接triggerPosition
到一个计时器以便定期更新位置
但是,当我运行我的程序时,会有一点延迟,我mouseArea
变得无法使用并且程序崩溃了。当我尝试打印经度以查看它是否更新时,初始值会多次打印到终端,但随后程序崩溃并且MapCircle
地图上不存在
My Qml 文件的相关部分如下所示:
有人可以在这里指出我正确的方向吗?
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,我似乎只会收到警告。
感谢您的帮助。
编辑:这是一个简单的示例代码
c++ - 使用 CMake 创建 QML 插件
我正在尝试使用 CMake 创建简单的 QML C++ 插件。有我的消息来源:
CMakeLists.txt:
主.cpp:
假人.h:
myplugin.h:
main.qml:
我还在我的构建目录中创建了名为MyPlugin的目录,其中包含指向构建的 libdummy.so 和qmldir 文件的链接,如下所示:
项目构建,但是当我运行它时,我收到一个错误:
我的函数的调试输出registerTypes
没有被调用(stdout 上没有输出),所以我假设由于某些原因没有注册类型。如果我尝试通过将此行添加到myplugin.cpp来静态注册类型:
,我得到一个错误:
我在这个插件中有什么问题以及如何使它与 CMake 一起工作?
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?
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 仍然冻结
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 表达式的官方文档,但没有找到任何具体解释 - 如果您参考官方文档,请引用相关部分。
请注意,我并不是要您测试其中任何一个是否适用于您的系统,而是要测试它是否应该有效 - 是否可以依赖它
c++ - 由于对象所有权问题,QT/QML 应用程序崩溃
我有一个使用静态 Qt C++ 库的 Qt/Qml 应用程序。类(模型等)驻留在库中,其对象在应用程序的 main.cpp 或 QML 文件中创建。一些类是从 QObject 派生的。关闭具有这些类的对象的屏幕时出现分段错误。即使在关闭屏幕后,我也需要维护对象。
我尝试过使用 QQmlEngine::setObjectOwnership()。我不能在这些类的构造函数中使用它,因为 QQmlEngine 类不适用于库项目。所以我在创建对象后在应用程序中设置它。
这里 getDbpointObject() 是一个槽,返回一个从 QObject 派生的类的对象。
然后我将对象传递给内部类的函数以设置其所有权。
在某些示例中,可以看到在创建对象后设置所有权是可以的。不确定它是否正确,或者我们必须在构造函数中这样做,我没有办法?