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
宏添加到boundSubWindw
class并显式重新运行qmake(你必须做当将这些 Qt 宏添加到以前没有它们的文件时)。
此外,您应该使用新的连接语法,这样您会得到编译时错误而不是 运行 时间错误:
connect(m_Thread, &myThread::mySignal,
m_subWindow, &boundSubWindow::myFunc);
最后,class 名称以大写开头是常见的 Qt 约定,因此如果您希望其他 Qt 程序员能够轻松地重命名为 BoundSubWindow
和 MyThread
,请考虑重命名阅读你的代码。
我遇到的问题是在调用 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
宏添加到boundSubWindw
class并显式重新运行qmake(你必须做当将这些 Qt 宏添加到以前没有它们的文件时)。
此外,您应该使用新的连接语法,这样您会得到编译时错误而不是 运行 时间错误:
connect(m_Thread, &myThread::mySignal,
m_subWindow, &boundSubWindow::myFunc);
最后,class 名称以大写开头是常见的 Qt 约定,因此如果您希望其他 Qt 程序员能够轻松地重命名为 BoundSubWindow
和 MyThread
,请考虑重命名阅读你的代码。