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 のアプリケーション出力パネルに):

Object::connect: そのようなシグナルはありませんDetectorEngineThread ::
statusChanged(DetectorEngineThread::Status) in ...
Object::connect: そのようなシグナルはありません

そして明らかに、一致するシグナルが発行されているにもかかわらず、スロットのコードは決して実行されません。

私は試した:

  • 列挙型をグローバルスコープに移動しましたが、問題は残りました。
  • QMetaObject::connectSlotsByName を介して信号とスロットを自動的に接続しますが、同じ問題に遭遇しました。
  • qRegisterMetaType および Q_DECLARE_METATYPE でローカル名 (たとえば、DetectorEngineThread::Status の代わりに Status) を使用し、SIGNAL および SLOT マクロでこれらを使用しようとしました。
4

1 に答える 1

9

シグナルとスロットで宣言された列挙型は、完全に修飾されている必要があります。

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

次のようにする必要があります。

void statusChanged(DetectorEngineThread::Status newStatus);
void processingError(DetectorEngineThread::ErrorCode code);
于 2012-11-03T20:03:51.770 に答える