gpt4 book ai didi

c++ - 使用 QMetaProperty 进行自省(introspection)

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:21:32 27 4
gpt4 key购买 nike

我有一个类 ObjectA

class ObjectA : public QObject
{
Q_OBJECT
Q_PROPERTY(int _a READ a WRITE setA NOTIFY aChanged)
public:
ObjectA(int a) : _a(a) {}
int a() const { return _a;}
public slots:
void setA(int a) { _a = a; emit aChanged(_a);}
signals:
void aChanged(int);
private:
int _a;
};

和类 ObjectB

class ObjectB : public QObject
{
Q_OBJECT
Q_PROPERTY(int _b READ b WRITE setB NOTIFY bChanged)
public:
ObjectB(int b) : _b(b) {}
int b() const { return _b;}
public slots:
void setB(int b) { _b = b; emit bChanged(_b);}
signals:
void bChanged(int);
private:
int _b;
};

我想做这样的信号/槽连接

QObject::connect(&objA, SIGNAL(aChanged(int)), &objB, SLOT(setB(int)));

只知道名字的属性。

ObjectA objA(10);
ObjectB objB(5);
QObject * objectA = &objA;
const QMetaObject* metaObjectA = objectA->metaObject();
QMetaProperty metaPropertyA = metaObjectA->property(metaObjectA->indexOfProperty("_a"));


QObject * object = &objB;
const QMetaObject* metaObjectB = object->metaObject();
QMetaProperty metaPropertyB = metaObjectB->property(metaObjectB->indexOfProperty("_b"));

QObject::connect(&objA, metaPropertyA.notifySignal().methodSignature(), &objB, ... );

objA.setA(2);
std::cout << "objA.a() = " << objA.a() << " objB.b() = " << objB.b() << std::endl;

但是

metaPropertyA.notifySignal().methodSignature()

不返回函数的指针,我不知道如何获取 set 方法指针。

最佳答案

metaPropertyA.notifySignal().signature() 不返回方法指针,而是返回其签名(文本表示)- 在您的情况下为“aChanged(int)”,这就是您需要的 connect( ).

如果您想直接调用它,可以使用 metaPropertyA.notifySignal().invoke(...)

编辑:您需要像 SIGNAL 和 SLOT 宏一样连接一些数字和方法名称

所以你需要以编程方式创建

QObject::connect(&objA, "2aChanged(int)", &objB, "1setB(int)");

但是如何得到“1setB(int)”是另外一个任务

编辑2:我不知道数字是什么意思,因为它不是索引

关于c++ - 使用 QMetaProperty 进行自省(introspection),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25551042/

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