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

时间:2018-04-18 07:26:17

标签: 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

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已启动。

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

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

  1. 在处理程序类中创建一个信号,该信号与returnHandler插槽的参数匹配。例如。 void handlerSignal(int)。
  2. handlerSignal()中使用QThread::started() SIGNAL代替connect()信号。
  3. handlerSignal()启动后发出QThread
  4. `

    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);
    

    谢谢!

2 个答案:

答案 0 :(得分:6)

两件事:

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

答案 1 :(得分:0)

connect字符串作为信号的标识&amp;插槽连接。宏SIGNALSLOT将它们的参数串联起来(使用预处理器功能)。因此,SIGNALSLOT的参数必须是函数名称,括号中的参数 types 。你不能用它们进行参数绑定。

如果你需要连接到一个神经信号,你需要一个隐藏的插槽。