Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QThread中的插槽和信号_C++_Qt_Qthread_Qt Signals - Fatal编程技术网

C++ QThread中的插槽和信号

C++ QThread中的插槽和信号,c++,qt,qthread,qt-signals,C++,Qt,Qthread,Qt Signals,我正在尝试将线程2中的信号连接到主线程中的插槽,我有这样的构造函数,它作为QThread的子类在线程2中运行: InputHandler::InputHandler() { connect(this, SIGNAL(write(User*, Message)), TTCServer::ttcserver, SLOT(write(User*, Message))); qDebug() << "new thread created!"; } 我的InPurthandle

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

InputHandler::InputHandler()
{
    connect(this, SIGNAL(write(User*, Message)), TTCServer::ttcserver, SLOT(write(User*, Message)));
    qDebug() << "new thread created!";
}
我的InPurthandler.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
void TTCServer::write(User* user, Message message)
{
    qDebug() << "Signal recieved!";
}
那么,为什么
connect()
函数中的
write(User*,Message)
试图成为
QThread::write()
,而不是
InputHandler::write()


用户
消息
是类,请澄清。

您忘记将
Q\u对象
宏添加到
InputHandler

class InputHandler : public QThread
{
    Q_OBJECT
public:
    InputHandler();
    void run();
<...>
类InputHandler:publicqthread
{
Q_对象
公众:
InputHandler();
无效运行();

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

如果使用Qt5,则它们有一个新的
connect()格式
使用实际地址而不是信号和插槽宏。也许这对您来说会更容易预测。我使用的是Qt5.8,我不需要更改代码,因为新的Qt向后兼容,但无论如何,这是您在这里展示的一个很好的功能。就是这样,谢谢!我对vtable进行了
未定义的引用
但是
Build->Run qmake
成功了。@Ginko,是的,这是因为在添加/删除这些宏之后,您总是需要运行qmake,因为在这些文件上运行moc实用程序的是qmake
void TTCServer::write(User* user, Message message)
{
    qDebug() << "Signal recieved!";
}
class InputHandler : public QThread
{
    Q_OBJECT
public:
    InputHandler();
    void run();
<...>