Qt 的 slot(?) 插入冗余命名空间到 connect

Qt's slot(?) inserts redundant namespace into connect

我遇到的问题是在调用 connect 时出现以下错误消息,MRC 是我认为 Qt 不应该添加的冗余名称空间 - boundSubWindow 未在 MRC 中定义。我的理解是找不到插槽函数,因为 MRC:: 被添加到它的名称之前。

QObject::connect: z:\mrc\mrc\mrc.h:23 中没有这样的插槽 MRC::boundSubWindow::myFunc(unsigned char *, int) QObject::connect:(收件人姓名:'MRCClass')

密码是

------------ mrc.h ----------


#include <QtWidgets/QMainWindow>

#include "ui_MRC.h"

#include "myThread.h"
#include "boundsubwindow.h"

class MRC : public QMainWindow
{
    Q_OBJECT

public:
    MRC(QWidget *parent = Q_NULLPTR) : QMainWindow(parent)
    {
        ui.setupUi(this);

        m_Thread = new myThread;
        m_Subwindow = new boundSubWindow;

        connect(MRC::m_Thread, SIGNAL(mySignal(char *, int)),
                this, SLOT(boundSubWindow::myFunc(unsigned char *, int)));
    }

    static inline myThread *m_Thread;
    boundSubWindow *m_Subwindow;

private:
    Ui::MRCClass ui;
};

------------ boundsubwindow.h ----------


#include <QMdiSubWindow>

class boundSubWindow : public QMdiSubWindow
{
public:
    boundSubWindow() {}

public slots:
    void myFunc(unsigned char *, int);
};

------------ boundsubwindow.h ----------


void boundSubWindow::myFunc(unsigned char *, int) {}

------------ myThread.h ----------


#include <QThread>

class myThread : public QThread
{
    Q_OBJECT

public:
    myThread() {}

signals:
    void mySignal(char *, int);
};

我已经跳过了为 Qt GUI 应用程序自动生成的 main.cpp,而 MRC.ui - 自动生成然后使用 Qt Creator 添加了一个 QMdiArea。我正在使用 Visual Studio 2017 和 Qt 5.13

这是错误的:

connect(MRC::m_Thread, SIGNAL(mySignal(char *, int)),
            this, SLOT(boundSubWindow::myFunc(unsigned char *, int)));

boundSubWindow::myFunc 不是 this 的插槽。此外,为 m_Thread 成员变量指定命名空间似乎很多余。你可能想要这个:

connect(m_Thread,    SIGNAL(mySignal(char *, int)),
        m_subWindow, SLOT(myFunc(unsigned char *, int)));

此外,将Q_OBJECT宏添加到boundSubWindwclass并显式重新运行qmake(你必须做当将这些 Qt 宏添加到以前没有它们的文件时)。


此外,您应该使用新的连接语法,这样您会得到编译时错误而不是 运行 时间错误:

connect(m_Thread,    &myThread::mySignal,
        m_subWindow, &boundSubWindow::myFunc);

最后,class 名称以大写开头是常见的 Qt 约定,因此如果您希望其他 Qt 程序员能够轻松地重命名为 BoundSubWindowMyThread,请考虑重命名阅读你的代码。