Enum параметр сигнала

Я пытаюсь использовать механизм сигналов и слотов Qt с пользовательскими типами перечисления.

Я прочитал все следующее, и ничего из этого не помогло:

DetectorEngineThread.h:

class DetectorEngineThread : public QThread
{
Q_OBJECT
Q_ENUMS(ErrorCode)
Q_ENUMS(Status)

public:
enum ErrorCode
{
...
};

enum Status
{
...
};
...

signals:
void statusChanged(Status newStatus);
void processingError(ErrorCode code);
};

Q_DECLARE_METATYPE(DetectorEngineThread::ErrorCode)
Q_DECLARE_METATYPE(DetectorEngineThread::Status)

mainwindow.h:

...
#include "DetectorEngineThread.h"...

class MainWindow : public QMainWindow
{
Q_OBJECT
...

private:
DetectorEngineThread* m_detEng;
...

private slots:
void on_detEng_statusChanged(DetectorEngineThread::Status newStatus);
void on_detEng_processingError(DetectorEngineThread::ErrorCode errorCode);
...
};

mainwindow.cpp:

...
#include "MainWindow.h"...

MainWindow::MainWindow(...) : ...
{
...
qRegisterMetaType<DetectorEngineThread::Status>("DetectorEngineThread::Status");
qRegisterMetaType<DetectorEngineThread::ErrorCode>("DetectorEngineThread::ErrorCode");
...

m_detEng = new DetectorEngineThread(...);

connect(m_detEng, SIGNAL(statusChanged(DetectorEngineThread::Status)),
this, SLOT(on_detEng_statusChanged(DetectorEngineThread::Status)), Qt::QueuedConnection);

connect(m_detEng, SIGNAL(processingError(DetectorEngineThread::ErrorCode)),
this, SLOT(on_detEng_processingError(DetectorEngineThread::ErrorCode)), Qt::QueuedConnection);
...
}
...

void MainWindow::on_detEng_statusChanged(DetectorEngineThread::Status newStatus)
{
...
}

void MainWindow::on_detEng_processingError(DetectorEngineThread::ErrorCode errorCode)
{
...
}
...

Во время выполнения я получаю следующие сообщения (на панели «Вывод приложения» в Qt Creator):

Object :: connect: такого сигнала нет
DetectorEngineThread :: statusChanged (DetectorEngineThread :: Status) в …
Object :: connect: такого сигнала нет
DetectorEngineThread :: processingError (DetectorEngineThread :: ErrorCode) в …

И, очевидно, код слотов никогда не запускается, несмотря на то, что испускаются совпадающие сигналы.

Я старался:

  • перевести перечисления в глобальный охват, но проблема осталась.
  • автоматическое подключение сигналов и слотов через QMetaObject :: connectSlotsByName, но с той же проблемой.
  • используя локальные имена (например, Status вместо DetectorEngineThread :: Status) в qRegisterMetaType и Q_DECLARE_METATYPE, а также пытался использовать их в макросах SIGNAL и SLOT.

4

Решение

Перечисления, объявленные в сигналах и слотах, должны быть полностью квалифицированы так:

void statusChanged(Status newStatus);
void processingError(ErrorCode code);

Должно быть:

void statusChanged(DetectorEngineThread::Status newStatus);
void processingError(DetectorEngineThread::ErrorCode code);
9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]