2017-03-23 80 views
0

對不起,如果標題不是很明確。這裏是例子,一個classA有幾個孩子,childA1childA2等存儲在classAlistQt - C++ - 通過父連接訪問的子項的功能

QList<ClassA> listA; 
listA << childA1() << childA2(); 

childA1具有不中classA存在功能start()。所以,如果我嘗試:

listA[0].start(); 

編譯器說,classA沒有成員start()start()被公槽,我做:

connect(this, SIGNAL(signalStart()), listA[0], SLOT(start())); 

,它的工作。所以我的問題是如何知道這個函數start()作爲classA存儲在列表中後?有沒有辦法知道「原始」類型?

回答

3

Qt的信號/插槽做工用內省(列出在運行任何QObject的方法和屬性的能力)。

Qt利用Meta-Object Compiler工具在C++中具有內省功能。有關Qt信號/插槽內部的更多信息,您可以查看this blog post

您可以使用沒有信號/插槽的內省。所以,在你的例子中,你不需要定義信號signalStart()只是爲了能夠調用start()方法。相反,你可以做這樣的事情:

QMetaObject::invokeMethod(listA[0], "start"); 

這將查找在指定QObject(無論指針類型的)函數命名啓動,並調用它。

下面是使用內省的工作的完整示例:

#include <QtCore> 

QTextStream& qOut(){static QTextStream out(stdout); return out;} 

class MyObject : public QObject{ 
    Q_OBJECT 
public: 
    explicit MyObject(QObject* parent= nullptr):QObject(parent){} 
    ~MyObject(){} 
    //Object has a slot named func 
    Q_SLOT void func(){ qOut() << "Hello func!\n"; } 
}; 

int main(int , char*[]){ 
    QObject* object = new MyObject(); 

    //print the object's class name (this is the real class name!) 
    qOut() << object->metaObject()->className() << "\n"; 

    //look for a function named func in the object, and invoke it 
    QMetaObject::invokeMethod(object, "func"); 

    return 0; 
} 

//run MOC on this CPP file 
#include "main.moc" 
0

首先,您應該在QList中存儲對象的指針。

那麼你可以使用dynamic_cast確定哪些孩子鍵入您的目標是:

A *obj = listA[0]; 

if (A1 *a1 = dynamic_cast<A1 *>(obj)) { 
    // This is an A1 object, you can call start() 
    a1->start(); 
} else if (A2 *a2 = dynamic_cast<A2 *>(obj)) { 
    // This is an A2 object 
}