qt - 在 C++ 中创建 QML 元素?

标签 qt qml qt5 qtquick2

我有以下问题:

我将初始界面加载到 QQuickView使用 .qml文件。
然后我想添加 QML typesImageText到使用 C++ 的接口(interface)。

我知道我可以从 C++ 中操作现有元素,但是如何创建新类型并添加它们?

最佳答案

不幸的是,文档有点过时(使用 Qt4 api),但是如果您阅读 部分从 C++ 加载 QML 组件 这里:https://doc.qt.io/qt-4.8/qtbinding.html

然后你应该有类似的东西(使用 Qt5 api):

QQuickView view;
view.setSource(QUrl::fromLocalFile("MyView.qml"));
QQmlComponent component(view.engine()
        , QUrl::fromLocalFile("MyItem.qml"));
QObject *object = component.create();

这为您提供了来自 .qml 文件的 QObject,但缺少的是如何将其添加到 View 中。在 qml 中,除非它们是 View 的父项,否则不会绘制项目。一种方法是将项目添加到根上下文,如下所示:
QQmlProperty::write(object, "parent"
                    , QVariant::fromValue<QObject*>(view.rootObject()));

另外,请注意(再次来自上面的链接):“您应该始终使用 QObject::setProperty()、QDeclarativeProperty 或 QMetaProperty::write() 来更改 QML 属性值,以确保 QML 引擎知道属性更改”。

接下来,我们需要设置项目的所有权,否则 JavaScript 垃圾处理程序会删除您的项目,您可以随机 seg fault。
QQmlEngine::setObjectOwnership(object, QQmlEngine::CppOwnership);

最后,您需要记住删除对象“object”。因为它是一个 QObject 你应该使用:
object->deleteLater();

希望对某人有所帮助!

关于qt - 在 C++ 中创建 QML 元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14092319/

相关文章:

c++ - 在 Qt 中滚动滚动区域

javascript - QML 中的基本 Javascript/数学……为什么不起作用?

c++ - 无法使用 qss 文件设置样式表属性

c++ - 使用 Qt 绘制像素完美的圆形

c++ - Qt QDomElement 性能问题

c++ - 显示Qt资源中没有的图片

c++ - 为数组元素赋值后程序崩溃

c++ - 从 C++ 代码创建单独的 QML 窗口

c++ - 如何在 WebView(QtQuick 2.0 和 QtWebKit 3)中使用 statusChanged?

c++ - QListView::doubleClicked 的插槽未被调用