【问题标题】:QStateMachine timing (showing a non-blocking dialog via QState entered() signal)QStateMachine 计时(通过 QState 输入()信号显示非阻塞对话框)
【发布时间】:2013-10-15 09:39:06
【问题描述】:

当在QStateMachine 中输入一个 QState 时,一些 Widget 对象属性会使用 assignProperty() 设置,并且 enter() 信号用于运行一个 Slot 方法,该方法 exec() 是一个 QDialog。

这主要是可行的,但对话框是在分配属性之前创建的,这是不希望的,因为属性只是在对话框关闭后才最终分配。

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

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

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

【问题讨论】:

  • QDialog可以设置为非模态
  • 对话框必须是模态的(我使用单次计时器的解决方法目前有效)。

标签: c++ qt qstatemachine


【解决方案1】:

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

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) 信号以获取结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多