2014-08-28 32 views
2

我有一个类ObjectA内省与QMetaProperty

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))); 

只知道name的属性。

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()

不返回函数的指针,我也不怎么获取设置的方法指针。

+0

有没有记录的方式来获得方法指针。你不需要方法指针来调用方法,所以我不太明白你想要解决的问题。 – 2014-08-29 13:15:25

+0

用@ j123b567我做连接:QMetaObject :: connect(&objA,metaPropertyA.notifySignalIndex(),&objB,metaObjectB-> indexOfMethod(“setB1(int)”));现在我想在我的Q_PROPERTY上使用反射来获取写入方法的索引(slot)并替换“metaObjectB-> indexOfMethod(”setB1(int)“)” – artoon 2014-08-29 13:46:33

+0

有一个'QObject :: connect'方法需要' QMetaMethod'参数。你需要使用那个。根本不需要使用索引。您还需要告诉我们这是Qt 4还是Qt 5,因为它们有点不同。 – 2014-08-29 14:56:32

回答

1

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

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

编辑: 你需要一些数字和方法名进行连接和信号,并且SLOT宏做

所以你需要programaticcaly创建

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

,但如何让“1setB(INT)”是另一项任务

EDIT2: 我不知道是什么意思数量,因为它不是指数

+0

好吧,我看到了,但与'QObject :: connect(&objA,metaPropertyA.notifySignal()。方法签名(),&objB,SLOT(setB(int)));'我得到'QObject :: connect:尝试绑定非信号ObjectA :: Changed(int)“ – artoon 2014-08-28 15:17:01

+0

好吧,我看到你需要得到像这样的东西QObject :: connect(&objA,“2aChanged(int)”,&objB,“1setB(int)”); – j123b567 2014-08-28 15:38:56

+0

SIGNAL(metaPropertyA.notifySignal()。methodSignature())不能编译,所以我必须手动追加“2”? – artoon 2014-08-29 06:14:08