gpt4 book ai didi

c++ - 如何将具有指针成员的非 QObject 类公开给 QML?

转载 作者:行者123 更新时间:2023-11-28 02:57:35 25 4
gpt4 key购买 nike

我了解如何通过创建一个包含我的类作为成员的新 QObject 类来公开简单的数据成员。例如:

class MyClass {
public:
int anInt;
};

和包装器

class MyClassQWrapped : public QObject {
Q_OBJECT
Q_PROPERTY(int anInt READ anInt write setAnInt NOTIFY anIntChanged)
public:
int anInt(){return myClass.anInt;}
void setAnInt(int value){
if(myClass.anInt==value)return;
myClass.anInt = value;
emit anIntChanged;
}
signals:
anIntChanged();
private:
MyClass myClass;
};

但是如何用指针数据成员包装对象呢?比如说我有一个链表类,想把它暴露给 qml:

Class LinkedList {
public:
int anInt;
LinkedList *next;
};

我不能使用与上面相同的方法,因为包装器的属性将是指向 LinkedList 的指针,而不是指向 LinkedListQWrapped 的指针。如果列表被非 Qt 代码更改,我无法知道哪个(如果有的话)LinkedListQWrapped 对象对应给定的 LinkedList*

现在,我可以更改 c++ 模型,但我不能让它依赖于 Qt。我可以想到一个解决方案,我将 void* 用户数据成员添加到 c++ 类,然后在创建包装器后将其设置为指向相应的包装对象。

我在 box2d 中看到过这种事情.

这是解决问题的推荐方法吗?在库代码中提供 void* 用户数据成员以使它们与 Qt 等各种框架很好地兼容是否很常见?还是有其他解决方案来解决这个问题?

最佳答案

我认为您不能将非QObject 派生类公开给 QML,因为我知道的唯一方法是通过 QQmlContext

查看 QML box2d extentsion,它似乎所有面向 QML 的类都以某种方式从 QObject 派生,在这里查看 box2d repo .

也就是说,他们确实使用包装函数在 QML box2d 类型和常规非 QObject 类型之间进行转换。即

/**
* Convenience function to get the Box2DJoint wrapping a b2Joint.
*/
inline Box2DJoint *toBox2DJoint(b2Joint *joint)
{
return static_cast<Box2DJoint*>(joint->GetUserData());
}

关于c++ - 如何将具有指针成员的非 QObject 类公开给 QML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21624821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com