Слот Qt (?) Вставляет избыточное пространство имен в соединение - PullRequest
0 голосов
/ 06 ноября 2019

Проблема, которую я получаю, заключается в следующем сообщении об ошибке при вызове connect, с MRC, являющимся избыточным пространством имен, которое, я думаю, не должно было добавляться Qt - boundSubWindow не определено внутри MRC. Насколько я понимаю, функция слота не найдена, потому что MRC :: был добавлен перед ее именем.

QObject :: connect: Нет такого слота MRC :: boundSubWindow :: myFunc (unsigned char *, int) вz: \ mrc \ mrc \ mrc.h: 23 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);
};

Я пропустил автоматически сгенерированный main.cpp для приложения с графическим интерфейсом Qt, а MRC.ui - сгенерированный автоматически, затем добавил QMdiArea с Qt Creator. Я использую Visual Studio 2017 и Qt 5.13

1 Ответ

1 голос
/ 07 ноября 2019

Это неправильно:

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 является то, что имена классов начинаются с заглавной буквы, поэтому рассмотрите возможность переименования в BoundSubWindow и MyThread, если вы хотите, чтобы другие программисты Qt могли легко читать ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...