使用QMetaProperty进行反思

时间:2014-08-28 14:15:35

标签: c++ qt qmetaobject

我有一个班级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方法指针。

1 个答案:

答案 0 :(得分:1)

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

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

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

所以你需要programaticcaly创建

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

但如何获得“1setB(int)”是另一项任务

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