Qt 文档指出,可以将两个信号连接在一起:
甚至可以直接将一个信号连接到另一个信号。
我尝试过:
connect(x, SIGNAL(S()), y, SIGNAL(func()));
它按照提到的方式工作,但Qt文档继续说:
(每当第一个信号被发出时,这将立即发出第二个信号。)
这是否意味着QueuedConnection将无法正常工作?我能否跨线程连接两个信号?
我之所以问这个问题是因为通过避免这种情况,我解决了应用程序中一类崩溃问题,但我不确定这是否与连接信号有关。
Qt 文档指出,可以将两个信号连接在一起:
甚至可以直接将一个信号连接到另一个信号。
我尝试过:
connect(x, SIGNAL(S()), y, SIGNAL(func()));
它按照提到的方式工作,但Qt文档继续说:
(每当第一个信号被发出时,这将立即发出第二个信号。)
这是否意味着QueuedConnection将无法正常工作?我能否跨线程连接两个信号?
我之所以问这个问题是因为通过避免这种情况,我解决了应用程序中一类崩溃问题,但我不确定这是否与连接信号有关。
before signal()
after signal()
slot() called
before signal()
slot() called
after signal()
如预期的那样,它没有生成任何错误或警告,程序也不会崩溃。然而,这个简单的例子并不能证明它同样适用于一个大型且复杂的例子。
main.cpp:
#include <QtGui/QApplication>
#include "dialog.h"
#include "testssconnection.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
TestSignalSignalConnection * t = new TestSignalSignalConnection();
t->start();
return a.exec();
}
testssconnection.h:
#ifndef TESTSSCONNECTION_H
#define TESTSSCONNECTION_H
#include <QObject>
#include <QThread>
class TestSignalSignalConnection : public QThread
{
Q_OBJECT
public:
explicit TestSignalSignalConnection(QObject *parent = 0);
void run();
signals:
void signal1();
void signal2();
public slots:
void slot();
};
#endif // TESTSSCONNECTION_H
testssconnection.cpp:
#include "testssconnection.h"
#include <QtCore>
TestSignalSignalConnection::TestSignalSignalConnection(QObject *parent) :
QThread(parent)
{
}
void TestSignalSignalConnection::run()
{
TestSignalSignalConnection *t = new TestSignalSignalConnection();
this->connect(this,SIGNAL(signal1()),t,SIGNAL(signal2()), Qt::QueuedConnection);
t->connect(t,SIGNAL(signal2()), t,SLOT(slot()), Qt::DirectConnection);
qDebug() << "before signal()";
emit signal1();
qDebug() << "after signal()";
exec();
}
void TestSignalSignalConnection::slot()
{
qDebug() << "slot() called";
}
sleep
,以使该线程中的插槽被同步调用第一个线程或在第二个线程中异步调用更加明显。 - tmpearce