枚举信号参数

Enum signal parameter

本文关键字:参数 信号 枚举      更新时间:2023-10-16

我正在尝试使用自定义枚举类型使用QT的信号和插槽机制。

我已经阅读了所有以下内容,但没有任何帮助:

  • http://doc.qt.digia.com/4.7-snapshot/qtbinding.html#using-enumerations-enumerations-us-a-custom-type
  • QT-无这样的信号错误
  • 用枚举作为参数的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创建者的应用程序输出面板中):

对象::连接:没有这样的信号
detectorenginethread :: statuschanged(detectorenginethread ::状态)...
对象::连接:没有这样的信号
detectorenginethread :: processingingerror(detectorenginethread :: errorcode)in ...

,显然,尽管发出了匹配的信号,但插槽的代码从未运行。

我尝试了:

  • 将枚举转移到全球范围中,但问题仍然存在。
  • 通过qmetaobject :: ConnectSlotsByname自动连接信号和插槽,但是遇到了相同的问题。
  • 在qregistermetatype和q_declare_metatype中使用本地名称(例如状态而不是detctorEnginethRead ::状态),并且还尝试在信号和插槽宏中使用它们。

在信号和插槽中声明的枚举应完全限定:

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

应该是:

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