QWizard中的异步验证

时间:2011-01-25 02:49:50

标签: qt qt4 wizard

我正在编写一个基于QWizard Qt对象的向导UI。在某种特殊情况下,我希望用户使用主机,用户名和密码登录服务。然后,向导的其余部分操纵此服务以执行各种设置任务。登录可能需要一段时间,尤其是在DNS名称需要很长时间才能解决的错误情况下 - 或者甚至可能根本无法解决。

所以我的想法是使用registerField机制强制所有三个字段,当用户点击Next时,我们在向导页面上显示一个小小的悸动,说“连接到服务器,请稍候...”,同时我们尝试在后台连接。如果连接成功,我们将进入下一页。如果没有,我们会突出显示有问题的字段,并要求用户重试。

然而,我对如何实现这一点感到茫然。我想到的选项:

1)覆盖validatePage并让它在后台启动一个线程。在validatePage()内输入一个等待,它将Qt事件循环泵出,直到线程结束。你认为这是最丑陋的解决方案,但是......

2)隐藏真正的Next按钮并添加一个自定义Next按钮,当单击该按钮时,在一个线程中调度我的长时间运行的函数,并等待某个东西引发'验证完成'信号。当发生这种情况时,我们手动调用QWizard :: next()(我们完全绕过了validatePage和朋友的真实验证逻辑。)这甚至更加丑陋,但将丑陋移到了可能使开发更容易的不同层次。

当然有更好的方法吗?

2 个答案:

答案 0 :(得分:5)

它不具有视觉吸引力,但您可以添加连接页面,然后移动到该页面。如果连接成功,请在向导上调用next(),如果连接失败,请致电previous()并突出显示相应的字段。它的优点是编码相对简单。

答案 1 :(得分:0)

我的最终选择是#2(覆盖下一个按钮,模拟其行为,但手动捕获其点击事件并执行我想要的事情。)编写胶水以定义下一个按钮的行为是最小的,我能够将QWizardPage子类化为一些钩子,让我在同一页面上运行我的任务,而不必切换到插页式页面并担心是向前还是向后。谢谢Caleb的回答。