我在QThread类中遇到信号/插槽问题。我的设计看起来像这样:
class Manager : public QObject {
Q_OBJECT
public:
Manager(QObject* parent) : QObject(parent) {
Thread thread* = new Thread(this);
connect(this, SIGNAL(testsignal()), thread, SLOT(test()));
thread->start();
...
emit testsignal();
}
signals:
void testsignal();
};
class Thread : public QThread {
Q_OBJECT
public slots:
void test() {
qDebug() << "TEST";
}
private:
void run() {}
};
信号永远不会到达我的test()方法。有人可以帮忙吗?感谢。
答案 0 :(得分:2)
问题是sending signals across threads导致将信号排队到目标线程的事件队列(排队连接)。如果该线程从不处理事件,它将永远不会得到信号。
另外,according to the QThread::run
documentation:
从此方法返回将结束线程的执行。
换句话说,使用空run
方法会导致线程立即终止,因此您需要向死线程发送信号。
答案 1 :(得分:0)
发送到QThread对象的信号将转到父对象的线程。在这种情况下,创建它的相同线程。
要让对象在另一个线程上运行,您应该将其移动到该线程:
class Manager : public QObject {
Q_OBJECT
public:
Manager(QObject* parent) : QObject(parent) {
Thread thread* = new QThread(this);
Receiver* rec = new Receiver(); //no parent
connect(this, SIGNAL(testsignal()), rec, SLOT(test()));
connect(thread, SIGNAL(finished()), rec, SLOT(deleteLater()));
rec->moveToThread(thread);
thread->start();
...
emit testsignal();
}
signals:
void testsignal();
};
class Receiver: public QObject {
Q_OBJECT
public slots:
void test() {
qDebug() << "TEST";
}
};