我正在尝试将 Qt 的信号和槽机制与自定义枚举类型一起使用。
我已阅读以下所有内容,但没有任何帮助:
- http://doc.qt.digia.com/4.7-snapshot/qtbinding.html#using-enumerations-of-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)
主窗口.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: 没有这样的信号
DetectorEngineThread::statusChanged(DetectorEngineThread::Status) in ...
Object::connect: 没有这样的信号
DetectorEngineThread::processingError(DetectorEngineThread::ErrorCode) in ...
很明显,插槽的代码永远不会运行,尽管发出了匹配的信号。
我试过:
- 将枚举移动到全球范围内,但问题仍然存在。
- 通过 QMetaObject::connectSlotsByName 自动连接信号和插槽,但这遇到了同样的问题。
- 在 qRegisterMetaType 和 Q_DECLARE_METATYPE 中使用本地名称(例如 Status 而不是 DetectorEngineThread::Status),并且还尝试在 SIGNAL 和 SLOT 宏中使用这些名称。