c++ - 枚举信号参数

标签 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)

主窗口.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);
    ...
};

主窗口.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: No such signal
DetectorEngineThread::statusChanged(DetectorEngineThread::Status) in ...
Object::connect: No such signal
DetectorEngineThread::processingError(DetectorEngineThread::ErrorCode) in ...

很明显,插槽的代码永远不会运行,尽管发出了匹配信号。

我试过:

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

最佳答案

在信号和槽中声明的枚举应该是完全限定的,因此:

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

应该是:

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

关于c++ - 枚举信号参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13212947/

相关文章:

c++ - DirectX 渲染和 OMP

模拟键盘命令的 C++ 代码

c++ - 测试 QQuickView (QWindow) 在 Qt 5.0.x 中是否全屏

c++ - 在 QMap 的特定偏移量处获取项目

python - 如何从另一个线程向 gui 发送标签 - PyQt

c++ - QObject::connect 未将信号连接到插槽

c++ - 使用英特尔 C++ 编译器在 C++ 中实现 MATLAB 函数

c++ - linux 使用 clock_nanosleep 休眠

javascript - ".import"语句(用于在 JS 中导入 Qml 类型)失败,出现语法错误

c++ - Qt在MainWindow的对象成员中连接SIGNAL和SLOT