我遇到的问题是在调用 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 程序员能够轻松地使用 BoundSubWindow
和 MyThread
阅读您的代码。
关于c++ - Qt 的 slot(?) 插入冗余命名空间到 connect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58729963/