QStateMachine 定时(通过 QState entered() 信号显示非阻塞对话框)

QStateMachine timing (showing a non-blocking dialog via QState entered() signal)

本文关键字:对话框 显示 信号 通过 QState entered QStateMachine 定时      更新时间:2023-10-16

在QStateMachine中输入QState时,使用assignProperty()设置了一些Widget对象属性,并且entered()信号用于运行exec()的QDialog的Slot方法。

这主要有效,但对话框是在分配属性之前创建的,这是不需要的,因为属性仅在对话框关闭后最终分配。

如果对话框不会阻塞,确切的顺序并不重要(它究竟"阻止"了什么?人类感知的外观应该是"同时的"。

解决方案将使对话框不阻塞,或确保在执行对话框之前设置属性。

我现在将尝试使用单次 QTimer 来延迟运行 QDialog exec() 的插槽,但当然,即使这应该有效,我仍然在寻找合适的解决方案。

目前,惯用的解决方案是有两种状态:第一个用于设置属性,第二个用于显示小部件:

QStateMachine machine;
auto * s1 = QState(&machine);
auto * s2 = QState(&machine);
machine.setInitialState(s1);
s1->assignProperty(widget, "property", value);
...
s1->addTransition(s2);
connect(s2, SIGNAL(entered()), widget, SLOT(exec()));
//or
s2->assignProperty(widget, "visible", true);
machine.start();

请注意,QDialog::exec()是一个插槽,因此您不需要自定义插槽来exec()对话框。将插槽连接到对话框的accepted()finished(int)信号以获得结果。