【发布时间】:2018-09-28 08:04:25
【问题描述】:
我有一堂课如下:
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);
}
如图所示,这是一个非常简单的类,旨在接收输入并将输入传递给外部类('otherclass')中的函数。在我的主应用程序('main.cpp')中,我创建了一个QThread,并在QThread启动时调用returnHandler槽,如下:
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: No such slot handler::returnHandler(someInput) in ../app/main.cpp:100
1234563 /p>
为什么添加参数会导致插槽不再被识别?
编辑:在下面的一些非常有用和赞赏的 cmets/answers 之后,我修改了方法如下:
- 在处理程序类中创建一个与
returnHandler槽的参数匹配的信号。例如。无效handlerSignal(int)。 - 使用
handlerSignal()SIGNAL 代替connect()中的QThread::started()信号。 - 在
QThread启动后发出handlerSignal()。
`
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);
谢谢!
【问题讨论】:
-
你必须以这种方式定义连接槽:
SLOT(returnHandler(int)。 IE。您需要提供相当插槽的签名。 -
请注意,
started和returnHandler的签名与附加参数不匹配... -
您可能(如果使用 Qt5)更喜欢新语法:
connect(thread, &QThread::started, hp, &Handler::returnHandler);。新语法甚至允许使用 lambda:connect(thread, &Qthread::started, [&hp, someInput]() { /*...*/ });。
标签: c++ qt signals-slots