我有一个课程如下:
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
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);
}
如图所示,这是一个非常简单的类,旨在接收输入并将输入传递给外部类中的函数(&#39; otherclass&#39;)。在我的主应用程序(&#39; main.cpp&#39;)中,我创建了QThread
,并在启动returnHandler
时调用QThread
位置,如下所示:
main.cpp中:
QThread* newThread = new QThread();
handler* handlerPointer = new handler();
handlerPointer->moveToThread(newThread);
connect(newThread, SIGNAL(started()), handlerPointer, SLOT(returnHandler(someInput)));
newThread->start();
我遇到的问题是:
我目前收到以下错误:
QObject :: connect:.. / app / main.cpp中没有这样的槽处理程序:: returnHandler(someInput):100
但是,如果我从处理程序类(int input
和.h
文件)中删除.cpp
,则SLOT()
会被识别并成功调用QThread
已启动。
为什么添加参数会导致无法再识别插槽?
编辑:在下面的一些非常翔实和赞赏的评论/答案之后,我修改了这个方法如下:
returnHandler
插槽的参数匹配。例如。 void handlerSignal
(int)。handlerSignal()
中使用QThread::started()
SIGNAL代替connect()
信号。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);
谢谢!
答案 0 :(得分:6)
两件事:
SLOT(returnHandler(int))而不是
SLOT(returnHandler(someInput))Qt使用信号和插槽的名称和参数列表来识别它们。我是你的情况,Qt寻找一个名为&#39; returnHandler&#39;并且只有一个参数,类型为#some; someInput&#39;。
答案 1 :(得分:0)
connect
将字符串作为信号的标识&amp;插槽连接。宏SIGNAL
和SLOT
将它们的参数串联起来(使用预处理器功能)。因此,SIGNAL
或SLOT
的参数必须是函数名称,括号中的参数 types 。你不能用它们进行参数绑定。
如果你需要连接到一个神经信号,你需要一个隐藏的插槽。