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 ...
显然,即使发出匹配信号,插槽的代码也不会运行.
我试过了:
在信号和插槽中声明的枚举应完全合格,因此:
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)
| 归档时间: |
|
| 查看次数: |
3643 次 |
| 最近记录: |