Cómo usar enums en señales Qt y slots

Tengo algunos problemas con el usoenum tipos de señales. Básicamente tengo dos clases, una máquina de estados y un subproceso que maneja la máquina de estados. Cuando se cambia el estado, quiero enviar una señal con el nuevo estado. También quiero representar al estado usando unaenum. En mi código completo, la máquina de estado se implementa en una biblioteca compartida separada, pero el código a continuación da exactamente el mismo error.

Cuando ejecuto el código obtengo el siguiente comportamiento:

kotte@EMO-Ubuntu:sigenum $ ./sigenum 
Object::connect: No such slot MyThread::onNewState(state)
Test signal 
Test signal 
...

Tengo cuatro archivos en mi código de muestra:statemachine.h, statemachine.cpp, main.h ymain.cpp. La función principal simplemente inicia el hilo, luego el hilo crea una instancia deStateMachine y procesa señales de laStateMachine. Soy bastante nuevo en Qt, así que me sorprendí un poco cuando me di cuenta de que tenía que incluir la enumeraciónQ_ENUMS y registrarlo con el sistema de tipos. Así que es totalmente posible que haya cometido un error de novato

El código de abajo es un poco largo, pero quería que fuera lo más parecido posible a mi código real.

statemachine.h parece:

// statemachine.h
#ifndef _STATEMACHINE_H
#define _STATEMACHINE_H

#include <QtCore>

class StateMachine : public QObject
{
    Q_OBJECT
    Q_ENUMS(state)

public:
    enum state {S0, S1, S2};

    void setState(state newState);

signals:
    void stateChanged(state newState);
    void testSignal(void);
};

Q_DECLARE_METATYPE(StateMachine::state);

#endif

Y se implementa como:

// statemachine.cpp
#include <QtCore>

#include "statemachine.h"

void StateMachine::setState(state newState)
{
    emit stateChanged(newState);
    emit testSignal();
}

El hilo se define como

// main.h
#ifndef _MAIN_H
#define _MAIN_H

#include <QtCore>

#include "statemachine.h"

class MyThread : public QThread
{
    Q_OBJECT

private:
    void run(void);

private slots:
    void onNewState(StateMachine::state);
    void onTestSignal(void);

private:
    StateMachine *myStateMachine;
};

#endif

Y se implementa de la siguiente manera:

// main.cpp
#include <QtCore>
#include <QApplication>

#include "statemachine.h"
#include "main.h"

void MyThread::run()
{
    myStateMachine = new StateMachine();

    qRegisterMetaType<StateMachine::state>("state");

    // This does not work
    connect(myStateMachine, SIGNAL(stateChanged(state)),
            this, SLOT(onNewState(state)));

    // But this does...
    connect(myStateMachine, SIGNAL(testSignal()),
            this, SLOT(onTestSignal()));

    forever {
        // ...
        myStateMachine->setState(StateMachine::S0);
    }
}

void MyThread::onTestSignal()
{
    qDebug() << "Test signal";
}

void MyThread::onNewState(StateMachine::state newState)
{
    qDebug() << "New state is:" << newState;
}