【问题标题】:QML/C++/QObject Struct CopyQML/C++/QObject 结构体复制
【发布时间】:2020-06-03 18:52:06
【问题描述】:

我的 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 给我的功能,因为这些类只是信息的容器。

是否有某种技巧或数据结构可以做到这一点?

【问题讨论】:

  • 您可以将 Q_GADGET 用于结构
  • 这可行,但缺点是该结构不能在 QML 本身中实例化(据我所知)。这将使绑定到 UI 元素成为不可能,这是我不愿错过的功能。
  • 我猜你不想做一个“创造者”功能(比如Qt.point(...))。也许cast operator 是一个选项?这确实复制了结​​构,但听起来你可能喜欢它

标签: c++ qt qml


【解决方案1】:

您可以对 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++ 更改的,而包装器仍然存在,则可能会比较棘手。如果您从 C++ 更改属性,QML 如何判断属性已更改,反之亦然。在这里,QObject 以及信号和槽就派上用场了。但是,如果数据在共享时是只读的,我想你应该没问题。

【讨论】:

  • 我最终得到了一个非常相似的解决方案。我现在使用带有 Q_GADGET 宏的普通结构并将它们包装在 QObject 类中。这允许我在 QML 中实例化我的数据结构并将它们传输到 C++。然后我在那里提取结构,可以复制等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多