c++ - QThread 中的槽和信号

标签 c++ qt qthread qt-signals

我正在尝试 connect() 线程 2 中的信号以插入主线程,我有这样的构造函数,它作为 QThread 的子类在线程 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()

需要明确的是,

UserMessage 是类。

最佳答案

您忘记将 Q_OBJECT 宏添加到 InputHandler 中:

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

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

关于c++ - QThread 中的槽和信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41938348/

相关文章:

c++ - "this"指针变为空 c++

c++ - 嵌套在模板化外部类中的非模板化结构如何访问外部类的静态成员?

c++ - 如何在 gcc 版本之间正确切换?

c++ - 如果在 TreeView Qt 中按下按钮,则重命名文件

c++ - 使用系统 DBus 的 registerService 失败(但适用于 session DBus)

c++ - 使用 QThread 运行可管理后台线程的正确方法

c++ - QThread 对象作为 worker 类的成员

c++ - C++ 中的 if(x^1!=1) 和 if(int(x^1)!=1) 有什么区别?

c++从文件中读取以构建基于指针的迷宫

c++ - QTimer & Select 使用。需要让拍卖时间正常运转