QML/C++/QObject Struct Copy

QML/C++/QObject Struct Copy

本文关键字:Copy Struct C++ QML QObject      更新时间:2023-10-16

我的Qt/QML程序使用C++中声明的类来构建QML中的信息,并将其作为捆绑包传递给C++函数。

这些结构派生自 QML 要求的 QObject。例:

class ResultStorageOptionsStruct : public QObject {
Q_OBJECT
public:
explicit ResultStorageOptionsStruct(QObject * parent = nullptr) : QObject(parent) {}
~ResultStorageOptionsStruct() = default;
ResultStorageOptionsStruct(const ResultStorageOptionsStruct& blob) {
}
bool folderValid;
QString folderURL;
Q_PROPERTY(bool folderValid MEMBER folderValid)
Q_PROPERTY(QString folderURL MEMBER folderURL)

};
Q_DECLARE_METATYPE(ResultStorageOptionsStruct);

使用这种方法,将信息从 QML 传递到C++可以毫无问题地工作,但是在C++端处理这些信息非常麻烦,因为您无法复制/分配类(派生自 QObject)。

我想复制/序列化/反序列化我的类,以便在它们处于 c++ 端后轻松处理。一旦我们处于 c++ 端,我就不需要 QObject 给我的功能,因为这些类只是信息的容器。

是否有某种技巧或数据结构来实现这一点?

您可以序列化和反序列化为 QIODevice,但这将用于文件存储。对我来说,这听起来更像是你想要一个围绕普通C++对象的 QObject 包装器。

我会用你需要的数据创建一个C++类。然后创建一个 QObject 派生类,其中包含对C++类的(弱)引用,在将原始类传递给 QML 时,您将原始类包装在中。

class MyData
{
public:
int x;
};
class MyDataWrapped : QObject
{
Q_OBJECT
public:
MyDataWrapped(MyData *obj) : md(obj) {}
void x() const { return md->x; }
Q_PROPERTY(...)
private:
MyData *md; // You might want to make this a weak pointer
};

潜在的棘手问题是,如果数据从 QML 或 C++ 更改,而包装器仍然存在。QML怎么知道一个属性被改变了,如果你从C++改变它,反之亦然。在这里,QObject、信号和插槽派上用场。但是,如果数据在共享时是只读的,我想你应该没问题。