在QStateMachine中输入QState时,使用assignProperty()设置一些Widget对象属性,并使用输入的()Signal运行一个exec()s Qdialog的Slot方法。
这主要有效,但是在分配属性之前创建了对话框,这是不需要的,因为只有在关闭对话框后才会事件性地分配属性。
如果对话框不会阻塞(它究竟是什么“阻塞”?),确切的顺序并不重要。人类感知的外表应该是“同时”的。
解决方案会使对话框无阻塞或确保在对话框执行之前设置属性。
我现在尝试使用一次性QTimer延迟运行QDialog的exec()的插槽,但当然我仍在寻找合适的解决方案,即使这应该有用。
答案 0 :(得分:0)
目前,惯用解决方案有两种状态:第一种设置属性,第二种显示小部件:
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)
信号以获得结果。