我想做的是构建一个 Qt 状态机。问题是我无法触发我自己的转换(更不用说我自己的事件了)。给出的答案很好,但会导致代码混乱。如果我不能使用 QT 转换,我为什么要使用 QT 状态机?如果你创建一个新项目,上面的第一个问题就解决了。QT 创建者很烦人。但是现在我的解决方案在这里,可能对其他人有所帮助。
首先我的状态:
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;
}
然后这个增强的信息(当前)被传递到我所在状态的槽,在那里我选择调用正确的转换来完成工作。如果需要,您可以将更多转换链接到它。
但最重要的是你不需要重新编程转换,我真的不喜欢这种想法。
谢谢你的帮助,我一个人做不了。