Ce que je voulais faire est de construire une machine d'état Qt. Le problème était que je ne pouvais pas déclencher mes propres transitions (et encore moins avec mes propres événements).Les réponses données sont bonnes mais conduiraient à un code désordonné. Pourquoi devrais-je utiliser une machine d'état QT si je ne pouvais pas utiliser les transitions QT? Le premier problème ci-dessus est résolu, si vous créez un nouveau projet. QT Creater est très ennuyeux. Mais voici maintenant ma solution, qu'elle aide les autres.
D'abord mon État:
class ServerState : public QState
{
Q_OBJECT
public:
ServerState(QPushButton * pushButton);
~ServerState();
public slots:
void buttonWasClicked();
protected:
void onEntry(QEvent *e);
void onExit(QEvent *e);
private:
QPushButton * pushButton;
};
normal, mais vous voyez que j'ajouté un emplacement. Cette fente me permet de connecter un signal de fond ou un Widget Mouse Press Signal à celui-ci!
Comme ceci:
QStateMachine *machine = new QStateMachine(this);
ServerState *s1 = new ServerState(connectButton);
connect(connectButton, SIGNAL(clicked()), s1, SLOT(buttonWasClicked()));
machine->addState(s1);
s1->addTransition(connectTransition);
tout ce que je devais à feu est-il maintenant un événement déclaré comme celui-ci:
#define RegisterToServerEventIndex User+5
class ConnectToServerEvent : public QEvent
{
public:
ConnectToServerEvent() : QEvent(QEvent::Type(QEvent::ConnectToServerEventIndex))
{}
};
lorsque la fente a été appelée:
void ServerState::buttonWasClicked()
{
this->machine()->postEvent(new ConnectToServerEvent());
qDebug("ServerState::buttonWasClicked");
}
L'État QT La machine appelle maintenant toutes les transitions, lien avec cet état:
ConnectToServerTransition::ConnectToServerTransition(QPushButton * pushButtonB,ServerSkeleton* serverSkeleton)
{
this->pushButtonB = pushButtonB;
this->pushButtonB->hide();
this->serverSkeleton = serverSkeleton;
qDebug("ConnectToServerTransition::ConnectToServerTransition");
}
bool ConnectToServerTransition::eventTest(QEvent *e)
{
return (e->type() == QEvent::ConnectToServerEventIndex);
}
void ConnectToServerTransition::onTransition(QEvent *e)
{
if (true == this->serverSkeleton->initalisieren())
{
this->pushButtonB->show();
}else{
qDebug("Conection to Server faild");
}
emit kill();
return;
}
Qu'est-ce si bon que j'ose poster? Eh bien d'abord vous pouvez lier un Qt SM à un widget où un événement de presse de la souris, ou quelque chose d'autre, est appelé et traiter les données brutes à un niveau dont vous avez besoin plus tard dans votre programme. Tout ce que vous devez ensuite faire est, pour émettre le Singal:
void Widget::mousePressEvent(QMouseEvent *event){
Coordinates current;
current.line = 0;
current.row = A;
current.row = (Row) (event->x()/30); // 30 = breite von einen Feld
current.line = event->y()/30; // 30 = länge von einen Feld
emit this->clicked(current);
return;
}
ensuite ces informations enhenced (en cours) est passé à la fente à mon état où j'ai choisi d'appeler la transition correcte qui fait le travail. Vous pouvez lier plus de transitions, si vous en avez besoin.
Mais le plus important, vous n'avez pas besoin de reprogrammer la transition, une pensée que je détestais vraiment.
Merci pour votre aide, je ne pouvais pas le faire seul.
Cette solution est correcte, mais l'état personnalisé est inutile. Un 'QSignalTransition' peut être utilisé pour connecter votre bouton à la machine. Vous pouvez intercepter 'QStateMachine :: SignalEvent' dans' eventTest' d'une transition personnalisée. Le 'SignalEvent :: arguments' vous donne accès aux arguments du signal, au cas où vous auriez besoin de les tester. Vous pouvez également tester d'autres conditions ici. –