枚举信号参数

Shd*_*dNx 4 c++ qt signals-slots

我正在尝试使用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)
Run Code Online (Sandbox Code Playgroud)

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);
    ...
};
Run Code Online (Sandbox Code Playgroud)

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)
{
    ...
}
...
Run Code Online (Sandbox Code Playgroud)

在运行时,我收到以下消息(在Qt Creator的Application Output面板中):

Object :: connect:没有这样的信号
DetectorEngineThread :: statusChanged(DetectorEngineThread :: Status)in ...
Object :: connect:没有这样的信号
DetectorEngineThread :: processingError(DetectorEngineThread :: ErrorCode)in ...

显然,即使发出匹配信号,插槽的代码也不会运行.

我试过了:

  • 将枚举转移到全球范围,但问题仍然存在.
  • 通过QMetaObject :: connectSlotsByName自动连接信号和插槽,但遇到了同样的问题.
  • 在qRegisterMetaType和Q_DECLARE_METATYPE中使用本地名称(例如Status而不是DetectorEngineThread :: Status),并尝试在SIGNAL和SLOT宏中使用它们.

cma*_*t85 9

在信号和插槽中声明的枚举应完全合格,因此:

void statusChanged(Status newStatus);
void processingError(ErrorCode code);
Run Code Online (Sandbox Code Playgroud)

应该:

void statusChanged(DetectorEngineThread::Status newStatus);
void processingError(DetectorEngineThread::ErrorCode code);
Run Code Online (Sandbox Code Playgroud)