2014-10-06 62 views
2

當對象名稱,信號和插槽全部在文本文件中指定時,如何連接2個對象的信號和插槽?Qt:連接來自文本的信號和插槽

獲取正確的對象名稱不是問題,因爲我可以輕鬆地遍歷數組並將名稱與文件中的點名進行比較,但是必須有某種方法可以返回信號並且從文件插槽,並用它在連接功能,如:

connect(rtnObj1(line),SIGNAL(rtnSignal(line)),rtnObj2(line),SLOT(rtnSlot(line))); 

其中RTN函數返回的對象名稱/信號/槽,和「線」是從該文件的當前的QString線。

我知道的唯一方法是通過在每個組合中進行字面編碼並將QStrings與if語句進行比較,但這會非常乏味,因爲組合的數量會非常高。

注: 這裏有一個簡單的例子演示基本這個問題如何存在。

第1幀: 4 QComboBoxes。第一和第三保持對象名稱,第二保持信號,第四保持槽。每個項目當然是這些列表中的一個QString。點擊一個按鈕將新行添加到文件中,寫入從每個框中選擇的文本。

第2幀:已經有必需的對象。讀取文件時,它會將列表中定義的對象與已創建的對象相匹配,並按照文件描述將它們連接起來。

基於文件所保存的數據很容易創建對象,但是如何從文件創建/拉取信號和插槽?

編輯: 除非,是否能夠這樣連接?

connect(objectA, "", objectB, ""); 

因爲我剛剛發現我的代碼可以編譯這樣的,但是每當我試圖把在插槽或信號名稱我得到這樣一個錯誤:

的QObject ::連接:使用在SIGNAL宏綁定瓷磚::點擊

回答

6

你的問題是與下面的靜態QObject::connect()方法的一個容易解決:

QMetaObject::Connection QObject::connect(
    const QObject *sender, const QMetaMethod &signal, 
    const QObject *receiver, const QMetaMethod &method, 
    Qt::ConnectionType type = Qt::AutoConnection) 

首先,您需要指向發送者和接收者對象的指針。有幾種方法可以存儲對象池。我建議把所有對象QHash:現在

QHash<QString, QObject *> m_objects; // I use QObject as a generic example 

,這是有可能找到一個指向任何對象以高效的方式連接。

下一步將從對應的QMetaObject對象獲取發送者信號和接收者插槽的對象QMetaMethod。使用QObject::metaObject()QMetaObject實例。

下面是其中只使用字符串參數連接兩個對象的函數的完整代碼:

void dynamicConnect(const QString &senderName, const QString &signalName, 
        const QString &receiverName, const QString &slotName) 
{ 
    QObject *emitter = m_objects.value(senderName); 
    int index = emitter->metaObject() 
      ->indexOfSignal(QMetaObject::normalizedSignature(qPrintable(signalName))); 
    if (index == -1) { 
     qWarning("Wrong signal name!"); 
     return; 
    } 
    QMetaMethod signal = emitter->metaObject()->method(index); 

    QObject *receiver = m_objects.value(receiverName); 
    index = receiver->metaObject() 
      ->indexOfSlot(QMetaObject::normalizedSignature(qPrintable(slotName))); 
    if (index == -1) { 
     qWarning("Wrong slot name!"); 
     return; 
    } 
    QMetaMethod slot = receiver->metaObject()->method(index); 

    QObject::connect(emitter, signal, receiver, slot); 
} 
+0

如果你正在尋找的示例代碼,你很可能看到兩個PyQt的綁定。 – o11c 2014-10-06 03:33:41

+0

是的!非常感謝!這正是我所期待的!我知道必須有某種方式來做這件事,因爲連接發生在運行時而不是編譯時。感謝您抽出時間來加入這個例子。現在一切正常。 – Yattabyte 2014-10-07 00:32:16