我想要做的是構建一個Qt狀態機。問題是我無法觸發我自己的轉換(更不用說我自己的事件了)。給出的答案很好,但會導致一個混亂的代碼。如果我不能使用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;
};
正常的,但你看我增加了一個插槽。這個插槽使我能夠連接底部信號或Widget鼠標按壓信號!
像這樣:
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;
}
那麼這個enhenced信息(當前)傳遞給插槽在我的國家,在這裏我選擇來調用正確的過渡,做的工作。如果您需要,您可以將更多轉換鏈接到它。
但最重要的是你不需要重新編程過渡,一想到我真的不喜歡。
謝謝你的幫助,我無法單獨完成。
該解決方案正確,但自定義狀態是不必要的。 QSignalTransition可以用來連接你的按鈕和機器。你可以在自定義轉換的eventTest中攔截'QStateMachine :: SignalEvent'。 'SignalEvent :: arguments'可以讓你訪問信號的參數,你需要測試它們。您也可以在那裏測試其他條件。 – 2015-09-11 15:15:24