为什么添加函数参数会导致SLOT()无法识别?

jar*_*121 1 c++ qt signals-slots

我有一个课程如下:

handler.h中:

#ifndef HANDLER_H
#define HANDLER_H

#include <QObject>

class handler : public QObject
{
    Q_OBJECT

public:
    explicit handler(QObject *parent = nullptr);
    ~handler();

public slots:
    void returnHandler(int input);
};

#endif // HANDLER_H
Run Code Online (Sandbox Code Playgroud)

handler.cpp:

#include "handler.h"
#include "otherclass.h"

handler::handler(QObject *parent) : QObject(parent)
{

}

handler::~handler()
{

}

void handler::returnHandler(int input)
{
    otherclass *otherclassPointer = otherclass::getInstance();
    otherclassPointer->returnFunction(input);
}
Run Code Online (Sandbox Code Playgroud)

如图所示,这是一个非常简单的类,旨在接收输入并将输入传递给外部类('otherclass')中的函数.在我的主应用程序('main.cpp')中,我创建了一个QThread,并returnHandlerQThread启动时调用插槽,如下所示:

main.cpp中:

QThread* newThread = new QThread();
handler* handlerPointer = new handler();
handlerPointer->moveToThread(newThread);
connect(newThread, SIGNAL(started()), handlerPointer, SLOT(returnHandler(someInput)));
newThread->start();
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是:

  • 我目前收到以下错误:

    QObject :: connect:在../app/main.cpp:100中没有这样的槽处理程序:: returnHandler(someInput)

  • 但是,如果我int input从处理程序类(文件.h.cpp文件)中删除它,则SLOT()QThread启动时会被识别并成功调用.

为什么添加参数会导致无法再识别插槽?

编辑:在下面的一些非常翔实和赞赏的评论/答案之后,我修改了方法如下:

  1. 在处理程序类中创建一个与returnHandler插槽参数匹配的信号.例如void handlerSignal(int).
  2. 使用handlerSignal()SIGNAL而不是QThread::started()信号connect().
  3. handlerSignal()一旦QThread开始就发出.

`

QThread* newThread = new QThread();
handler* handlerPointer = new handler();
handlerPointer->moveToThread(newThread);
connect(handlerPointer, SIGNAL(handlerSignal(int)), handlerPointer, SLOT(returnHandler(int)));
newThread->start();
emit handlerPointer->handlerSignal(someInput);
Run Code Online (Sandbox Code Playgroud)

谢谢!

小智 6

两件事情:

  1. Qt期望信号和插槽具有相同的参数类型.
  2. 在SLOT()中,您必须提供类型,而不是参数的名称.
    SLOT(returnHandler(int))
    代替
    SLOT(returnHandler(someInput))
    Qt使用信号和插槽的名称和参数列表来识别它们.我是你的情况,Qt寻找一个名为'returnHandler'的插槽,只有一个参数,来自'someInput'类型.