qt - 在 QML 中创建自定义 C++ 对象并将其存储在 C++ 模型中

标签 qt qml qtquick2 qt-quick

我用 C++ 编写了一个客户类(从 QObject 继承),并用 QML 成功注册了它的类型。目前,我正在 C++ 中静态创建此类的对象,并将指向它们的指针存储在实现 QAbstractListModel 的模型中。在 QML 中,我可以完美地访问对象作为模型的项目。

customObject 是一个非可视对象。

我在 GUI 应用程序 (QML) 的另一部分中使用委托(delegate)可视化 ListView 中的对象。

但是现在我想在 QML 中动态地从我的自定义类创建对象,并将它们也存储在模型中。这就是我挣扎的地方。我希望我可以像这样创建一个 customObject:

import com.myProject.myCustomStuff 1.0

...


Button{
   id: createObjBtn
   text: "create new CustomObj"
   onClicked:{
      var obj = MyCustomObj;
      myObjectManager.addObj(obj);  // object holding the implemented QAbstactListModel
      console.log(typeof(obj)); // returns [Object object]
      console.log(Qt.isQtObject(obj)) // returns false
   }
}

我会很感激你的想法。也许有人知道正确执行此操作的方法?

谢谢!

更新 1

按照 Simon-Warta 的要求,这里是 MyCustomObj 的构造函数实现。

MyCustomObj.cpp
MyCustomObj::MyCustomObj(QObject *parent) : QObject(parent)
{
    QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
}

最佳答案

您混淆了类的功能意图。 QAbstractListModel旨在作为容器的包装,是的,您可以将容器放在 QAbstractListModel 中派生类,但您实际上不必这样做,容器几乎可以是任何 C++ 类,甚至不一定是 QObject派生,它可以只是一个 QVector<Something>您可以通过指针从模型中访问。这适用于您有很多对象的情况,并且并非所有对象都需要始终拥有模型,因为这些模型非常重。

您实际上不需要关心所有权,将其留在 C++ 端,实际的对象创建也是如此,有一个称为插槽,将新对象添加到容器中,同时还使用模型的 beginInsertRows()endInsertRows()以便通知任何 View 以有效更新,新对象也应该在该插槽中创建,您可以从 QML 传递它所需的任何数据,只需确保所有数据都已在 Qt 元系统中注册,以便它可以使用QVariant用于 QML-C++ 互操作。

所以它应该是这样的:

myObjectManager.create(/* any needed data goes here */)

create()将最终数据传递给创建对象的 C++ 端,调用 beginInsertRows() ,将对象添加到模型的底层存储中,然后调用endInsertRows()你就完成了。

我更愿意将所有权保留在 C++ 方面(我不是明确表示),我可以控制它。在处理 C++ 和 QML 之间共享的对象所有权时,Qt 有点糟糕。理想情况下,应该有一个可以在 C++ 和 QML 上工作的共享指针类,因此一旦对它的所有引用都消失了,该对象就会被删除。但这不是“Qt 方式”——Qt 共享指针不适用于 QML,标准 C++ 共享指针也不能,实际上有一个完全不同的 QML 共享引用类,它甚至不是公共(public) API 的一部分IIRC,非常丑陋和短视的设计,只会扩大 C++ 和 QML 之间的差距以及相关的不便因素。

关于qt - 在 QML 中创建自定义 C++ 对象并将其存储在 C++ 模型中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31877881/

相关文章:

qt - 如何在QTableWidget中突出显示行?

c++ - 'QNetworkRequest' 的初始化没有匹配的构造函数

qt - RowLayout 和 ColLayout 中的 QML 文本对齐

python - 如何从 python 线程更新 QML ListView?

c++ - 不能在 QML 中使用 C++ 类

qml - QtQuick2 中的 QFormLayout 等效项?

qt - 导入语句未列出我的自定义 C++ 公开类

c++ - 如何让qlabel在场景中跟随光标

c++ - C++ 和 QML 的对象顺序创建 QT

c++ - Qt 中的 Windows 语音 API。在 main() 中工作,但在类里面有很多错误