撇開任何疑慮是否在另一個目的是在一個對象連接所有信號到一個單一的插槽實際上是一個明智的做法,下面是這樣做,有一個單元測試以及驗證它的工作原理功能。
如果你看標準輸出,而你運行它,你會看到它打印出所有它正在連接。當它運行時,單擊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();
}
想要刪除連接插槽發出信號的物體嗎? – Kunal 2012-04-11 05:22:01
我想捕捉任何來自對象的信號,以便能夠知道何時刪除它 – chikuba 2012-04-11 05:23:11
你不能使用deleteLater()嗎? – Kunal 2012-04-11 05:48:09