QThread中的插槽和信号

Slots and signals in QThread

本文关键字:信号 插槽 QThread      更新时间:2023-10-16

我正在尝试将线程 2 中的信号连接到主线程中的插槽,我有这样的构造函数,它在线程 2 中作为 QThread 的子类运行:

InputHandler::InputHandler()
{
    connect(this, SIGNAL(write(User*, Message)), TTCServer::ttcserver, SLOT(write(User*, Message)));
    qDebug() << "new thread created!";
}

但是我收到运行时错误

QObject::connect: No such signal QThread::write(User*, Message)

我的输入处理程序.h看起来像这样:

#ifndef INPUTHANDLER_H
#define INPUTHANDLER_H
#include <QThread>
#include <QDebug>
#include <QString>
#include "message.h"
#include "data.h"
class InputHandler : public QThread
{
public:
    InputHandler();
    void run();
private:
    Message message;
    void login(User* user, QString login);
    void sendLogins(User* user);
    void startGameWith(User* user, QString opponentLogin);
signals:
    void write(User* user, Message message);
};
#endif // INPUTHANDLER_H

如果它确实重要,我也包括ttcserver.h:

#ifndef TTCSERVER_H
#define TTCSERVER_H
#include <QTcpServer>
#include <QObject>
#include <QDebug>
#include "data.h"
#include "user.h"
#include "message.h"
#include "inputhandler.h"
class TTCServer : public QTcpServer
{
    Q_OBJECT
public:
    explicit TTCServer();
    static TTCServer* ttcserver;
    void run();
signals:
public slots:
    void newConnection();
    void write(User* user, Message message);
 private:
    QTcpServer* server;
    Message* message;
    void handleInputFrom(User* user);
};
#endif
 // TTCSERVER_H

void write方法在 ttcserver 中定义.cpp如下所示:

void TTCServer::write(User* user, Message message)
{
    qDebug() << "Signal recieved!";
}

那么,为什么write(User*, Message) connect()函数试图QThread::write()而不是InputHandler::write()呢?

UserMessage是类,需要明确。

您忘了将Q_OBJECT宏添加到InputHandler

class InputHandler : public QThread
{
    Q_OBJECT
public:
    InputHandler();
    void run();
<...>

由于缺少宏,moc 不会为信号/插槽创建相应的代码以在该类中工作,因此它尝试连接到 QObject ,因为它确实具有宏,并且是基类。