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

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

处理程序.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 槽,如下所示如下:

ma​​in.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

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

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

编辑:根据下面的一些非常有用和赞赏的评论/答案,我修改了如下方法:

  1. 在处理程序类中创建一个信号,它与 returnHandler 槽的参数相匹配。例如。 void handlerSignal(int).
  2. connect() 中使用了 handlerSignal() SIGNAL 而不是 QThread::started() 信号。
  3. 一旦 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);

谢谢!

最佳答案

两件事:

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

关于c++ - 为什么添加函数参数会导致无法识别 SLOT()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49893619/

相关文章:

c++ - 获取非常奇怪的数组边界异常

java - 如何重新排列数组中的数据,使两个相似的项目不相邻?

c++ - 独占打开文件/锁定文件

qt - 等待 SLOT 用 Qt 完成执行

android - 通过 ndk-build 构建 libcryptopp.a 时没有存档符号表(运行 ranlib)

c++ - "auto function()"可以在函数体内有几种类型的返回吗?

c++ - SQLite 更新 100 毫秒

c++ - 如果 child 调整大小,让 QWidget 和 QVBoxLayout 自动调整大小(Qt4)

c++ - Qt 自定义插槽

c++ - 从Qt中的静态类方法发送信号