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

标签 c++ qt signals

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

QObject::connect: No such slot MRC::boundSubWindow::myFunc(unsigned char *, int) in z:\mrc\mrc\mrc.h:23 QObject::connect: (receiver name: '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 宏添加到 boundSubWindw 类并显式地重新运行 qmake(将这些 Qt 宏添加到以前没有它们的文件)。


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

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

最后,类名以大写开头是常见的 Qt 约定,因此如果您希望其他 Qt 程序员能够轻松地使用 BoundSubWindowMyThread阅读您的代码。

关于c++ - Qt 的 slot(?) 插入冗余命名空间到 connect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58729963/

相关文章:

c++ - 从 C/C++ 中的日期和时间转换为 UNIX 时间戳的正确方法是什么?

c++ - QVariant userType() id

c - SIGIO从不开火

linux - MongoDB 被 Linux 杀死

c++ - 如何覆盖 QWizard 中的 "next"插槽?

c++ - Qt5 : QTextEdit to (LPVOID lpBuffer, DWORD dwBytesToWrite)

c++ - 如何使用 C++ 避免其中包含 "for"条件的 "if"循环?

c++ - QPushButton 更改布局中小部件的大小

即使在 MainWindow 关闭后,Qt 应用程序仍保留在内存中

python - django-paypal 收不到信号