Qt的slot(?)将冗余名称空间插入connect

时间:2019-11-06 12:16:17

标签: c++ qt signals

我得到的问题是调用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

1 个答案:

答案 0 :(得分:1)

这是错误的:

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语法,以便获得编译时错误而不是运行时错误:

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

最后,类名以大写开头是Qt的常见惯例,因此,如果希望其他Qt程序员能够轻松地读取代码,请考虑重命名为BoundSubWindowMyThread