2012-04-11 68 views
0

一直在四處查看,人們似乎有類似的問題,但來自不同來源的多個信號等。我的情況是,我有一個對象,如果它成功,失敗或被取消。這些信號被傳遞到另一個類,並且不連接到一個插槽,只是一個信號。現在我想解決這個問題,無論對象發送什麼信號(失敗,成功,取消),都會調用一個插槽來刪除對象。總之,我想要一種將物體的每個信號連接到一個插槽的方式。將所有的對象信號連接到一個插槽

想要做這樣的事情:

connect(myObject, allSignals, this, handleObjectDone()); 

void handleObjectDone() { 
    myObject->deleteLater(); 
} 

是否有這樣做的方法嗎?或者我應該每次通過兩個信號做一些事情,例如emit readyToBeDeleted()emit succeded()

謝謝!

+0

想要刪除連接插槽發出信號的物體嗎? – Kunal 2012-04-11 05:22:01

+0

我想捕捉任何來自對象的信號,以便能夠知道何時刪除它 – chikuba 2012-04-11 05:23:11

+0

你不能使用deleteLater()嗎? – Kunal 2012-04-11 05:48:09

回答

1

您可以將任意數量的信號連接到任意數量的插槽(以及其他信號)。爲了這個目的,將信號連接到兩個插槽是非常有意義的。插槽按照它們連接的順序調用。連續發射兩個信號也是非常合理的。當然,readyToBeDeleted()應該在succeeded()之後發出,以便在發出結果信號之前不刪除對象。

除非我誤解了你,這很簡單。

+0

將它們刪除,因爲這些槽被調用的順序是隨機的。我只是想解決這個問題,所以我不必連接每個信號兩次 – chikuba 2012-04-11 05:24:21

+1

@chikuba不,根據[文檔](http://qt-project.org/doc/qt-4.8/signalsandslots.html ),「如果有多個插槽連接到一個信號,插槽將按照它們連接的順序一個接一個地執行,當信號發出時。」 – Anthony 2012-04-11 05:25:39

+0

但我不會將多個插槽連接到一個信號。即時通訊以某種方式將每個信號從一個對象連接到一個特定插槽 – chikuba 2012-04-11 09:36:18

0

撇開任何疑慮是否在另一個目的是在一個對象連接所有信號到一個單一的插槽實際上是一個明智的做法,下面是這樣做,有一個單元測試以及驗證它的工作原理功能。

如果你看標準輸出,而你運行它,你會看到它打印出所有它正在連接。當它運行時,單擊QLineEdit將導致QLineEdit發出一個信號,這將會(當然)導致調用QApplication :: quit()槽,以便應用程序退出。

#include <stdio.h> 
#include <QApplication> 
#include <QLineEdit> 
#include <QMetaMethod> 
#include <QMetaObject> 

void ConnectAllSignalsToSlot(QObject * sourceObject, QObject * targetObject, const char * slotName) 
{ 
    const QMetaObject * mo = sourceObject->metaObject(); 
    if (mo) 
    { 
     int numMethods = mo->methodCount(); 
     int firstMethod = mo->methodOffset(); // set to 0 instead if you want to connect signals from superclasses too 
     for (int i=firstMethod; i<numMethods; i++) 
     { 
     QMetaMethod mm = mo->method(i); 
     if (mm.methodType() == QMetaMethod::Signal) 
     { 
      QString signalString = QString("2") + mm.signature(); 
      printf("Connecting up signal [%s] on object %p to slot [%s] on object %p\n", signalString.toUtf8().constData(), sourceObject, slotName, targetObject); // just so we can see what it's doing 
      QObject::connect(sourceObject, signalString.toUtf8().constData(), targetObject, slotName); 
     } 
     } 
    } 
    else printf("Error, sourceObject has no QMetaObject????\n"); 
} 

int main(int argc, char ** argv) 
{ 
    QApplication app(argc, argv); 

    QWidget * testSource = new QLineEdit; 
    testSource->show(); 

    ConnectAllSignalsToSlot(testSource, &app, SLOT(quit())); 

    return app.exec(); 
}