QThread 中的槽和信号
Slots and signals in QThread
我正在尝试将线程 2 中的信号连接()到主线程中,我有这样的构造函数,它作为 QThread 的子 class 在线程 2 中运行:
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)
我的 inputhandler.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!";
}
那么为什么 connect()
函数中的 write(User*, Message)
试图成为 QThread::write()
而不是 InputHandler::write()
?
User
和 Message
是 class,要清楚。
您忘记将 Q_OBJECT
宏添加到 InputHandler
中:
class InputHandler : public QThread
{
Q_OBJECT
public:
InputHandler();
void run();
<...>
由于缺少宏,moc 将不会为 signals/slots 创建相应的代码以在 class 中工作,因此它会尝试连接到 QObject
,因为它确实有宏,并且是基础 class.
我正在尝试将线程 2 中的信号连接()到主线程中,我有这样的构造函数,它作为 QThread 的子 class 在线程 2 中运行:
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)
我的 inputhandler.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!";
}
那么为什么 connect()
函数中的 write(User*, Message)
试图成为 QThread::write()
而不是 InputHandler::write()
?
User
和 Message
是 class,要清楚。
您忘记将 Q_OBJECT
宏添加到 InputHandler
中:
class InputHandler : public QThread
{
Q_OBJECT
public:
InputHandler();
void run();
<...>
由于缺少宏,moc 将不会为 signals/slots 创建相应的代码以在 class 中工作,因此它会尝试连接到 QObject
,因为它确实有宏,并且是基础 class.