首页 文章

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

提问于
浏览
1

我有一个课程如下:

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:在../app/main.cpp:100中没有这样的槽处理程序:: returnHandler(someInput)

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

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

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

  • 在处理程序类中创建一个与 returnHandler 插槽的参数匹配的信号 . 例如 . void handlerSignal (int) .

  • connect() 中使用 handlerSignal() SIGNAL而不是 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);

谢谢!

2 回答

  • 6

    两件事情:

    • Qt期望信号和插槽具有相同的参数类型 .

    • 在SLOT()中,您必须提供类型,而不是参数的名称 .

    SLOT(returnHandler(int))
    

    而不是

    SLOT(returnHandler(someInput))
    

    Qt使用信号和插槽's names and argument list to identify them. I your case, Qt looks for a slot named ' returnHandler ' and having only one parameter, from type ' someInput' .

  • 0

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

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

相关问题