一直在四处寻找,人们似乎有类似的问题,但有来自不同来源的多个信号等。我的情况是我有一个信号,如果它成功,失败或被取消的信号。这些信号被传递到另一个类并且没有连接到一个槽,只是一个信号。现在我想修复一下,无论对象发送什么信号(失败,成功,取消),都会调用一个删除对象的槽。简而言之,我想要一种将对象的每个信号连接到插槽的方法。
想要做这样的事情:
connect(myObject, allSignals, this, handleObjectDone());
void handleObjectDone() {
myObject->deleteLater();
}
有没有办法做到这一点?或者我应该在每次执行某些操作时传递两个信号,例如emit readyToBeDeleted()
和emit succeded()
?
谢谢!
答案 0 :(得分:1)
您可以将任意数量的信号连接到任意数量的插槽(以及其他信号)。为此目的,将信号连接到两个插槽是完全合理的。插槽按它们连接的顺序调用。连续发射两个信号也是完全合理的。当然,readyToBeDeleted()应该在succeeded()之后发出,这样在发出结果信号之前不会删除该对象。
除非我误解你,否则就这么简单。
答案 1 :(得分:0)
将关于将一个对象中的所有信号连接到另一个对象中的单个插槽的任何疑虑实际上都是明智之举,下面是一个执行此操作的函数,以及用于验证其工作的单元测试。
如果你在运行它时观看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();
}