カスタム列挙型で 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)
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 のアプリケーション出力パネルに):
Object::connect: そのようなシグナルはありませんDetectorEngineThread ::
statusChanged(DetectorEngineThread::Status) in ...
Object::connect: そのようなシグナルはありません
そして明らかに、一致するシグナルが発行されているにもかかわらず、スロットのコードは決して実行されません。
私は試した:
- 列挙型をグローバルスコープに移動しましたが、問題は残りました。
- QMetaObject::connectSlotsByName を介して信号とスロットを自動的に接続しますが、同じ問題に遭遇しました。
- qRegisterMetaType および Q_DECLARE_METATYPE でローカル名 (たとえば、DetectorEngineThread::Status の代わりに Status) を使用し、SIGNAL および SLOT マクロでこれらを使用しようとしました。