0

环顾四周,人们似乎也有类似的问题,但有来自不同来源的多个信号等。我的情况是,我有一个对象可以发出信号,表明它是否成功、失败或被取消。这些信号被传递给另一个类并且没有连接到一个插槽,只是一个信号。现在我想解决这个问题,无论对象发送什么信号(失败、成功、取消),都会调用一个槽来删除对象。简而言之,我想要一种将对象的每个信号连接到插槽的方法。

想做这样的事情:

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

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

有没有办法做到这一点?或者我应该每次它做某事时只传递两个信号,例如emit readyToBeDeleted()emit succeded()

谢谢!

4

2 回答 2

2

抛开关于将一个对象中的所有信号连接到另一个对象中的单个插槽是否实际上是明智之举的任何疑虑,下面是一个可以做到这一点的函数,以及一个单元测试来验证它是否有效。

如果您在运行此程序时观看 stdout,您将看到它打印出它正在建立的所有连接。当它运行时,点击 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();
}
于 2013-05-01T05:14:01.047 回答
1

您可以将任意数量的信号连接到任意数量的插槽(以及其他信号)。为此,将信号连接到两个插槽是非常有意义的。插槽按照它们连接的顺序被调用。连续发射两个信号也是完全合理的。当然 readyToBeDeleted() 应该在 succeeded() 之后发出,以便在发出结果信号之前不会删除对象。

除非我误会你,否则就这么简单。

于 2012-04-11T05:22:57.903 回答