Что я хотел сделать, так это собрать Qt State Machine. Проблема заключалась в том, что я не мог инициировать свои собственные переходы (не говоря уже о моих собственных событиях). Полученные ответы хорошие, но приведут к грязному коду. Зачем мне использовать конечный автомат QT, если я не могу использовать переходы QT?
Первая проблема, описанная выше, решается, если вы создаете новый проект. QT Creater очень раздражает.
Но вот теперь мое решение, может ли оно помочь другим.
Первый мой штат:
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;
};
Нормально, но вы видите, что я добавил слот. Этот слот позволяет мне подключить к нему нижний сигнал или сигнал нажатия мыши виджета!
Как это:
QStateMachine *machine = new QStateMachine(this);
ServerState *s1 = new ServerState(connectButton);
connect(connectButton, SIGNAL(clicked()), s1, SLOT(buttonWasClicked()));
machine->addState(s1);
s1->addTransition(connectTransition);
Теперь все, что мне нужно, - это запустить объявленное Событие, подобное этому:
#define RegisterToServerEventIndex User+5
class ConnectToServerEvent : public QEvent
{
public:
ConnectToServerEvent() : QEvent(QEvent::Type(QEvent::ConnectToServerEventIndex))
{}
};
когда слот вызывался:
void ServerState::buttonWasClicked()
{
this->machine()->postEvent(new ConnectToServerEvent());
qDebug("ServerState::buttonWasClicked");
}
Конечный автомат QT теперь будет вызывать все переходы, связывая это состояние:
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;
}
Что такого замечательного, что я осмелюсь опубликовать?
Ну, во-первых, вы можете связать Qt SM с виджетом, где вызывается событие нажатия мыши или что-то еще, и обрабатывать необработанные данные до уровня, который вам понадобится позже в вашей программе. Все, что вам нужно сделать, это испустить сингал:
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;
}
Затем эта расширенная информация (текущая) передается в слот в моем состоянии, где я решил вызвать правильный переход, который выполняет эту работу. Вы можете связать больше переходов с ним, если вам это нужно.
Но большинству важно, что вам не нужно перепрограммировать Переход, думаю, мне это очень не понравилось.
Спасибо за вашу помощь, я не мог сделать это один.