2012-11-03 50 views
4

我试图使用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 Creator中应用输出面板):

对象:: connect:没有这样的信号
DetectorEngineThread :: statusChanged(DetectorEngineThread :: Status)in ...
Obje克拉::连接:在...

明明插槽代码永远不会运行没有这样的信号
DetectorEngineThread :: processingError(DetectorEngineThread ::错误码),尽管匹配信号发出的事实。

我想:

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

回答

9

枚举要完全符合这样:

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

应该是:

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

该死的,我没有想到这一点。谢谢! – ShdNx

+0

我得到了同样的问题,除了它甚至没有显示我的运行时错误消息!在我的信号声明中对枚举类型进行排序解决了问题。 –

+0

该解决方案有效。然而,它的一个问题是,如果没有完全限定的枚举类型作为信号参数类型,Qt应用程序就会正常工作,特别是如果应用程序不涉及多线程。当涉及多线程时,我经常使用Qt 5.4获得以下Qt错误消息:QObject :: connect:无法排队'ErrorType'类型的参数 (确保'ErrorType'使用qRegisterMetaType()注册。)问题是:Qt是否可以增强为接受非完全限定枚举类型作为信号函数参数?会有什么困难? – jonathanzh