Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt QQ向导中的异步验证_Qt_Qt4_Wizard - Fatal编程技术网

Qt QQ向导中的异步验证

Qt QQ向导中的异步验证,qt,qt4,wizard,Qt,Qt4,Wizard,我正在基于QWizard Qt对象编写向导UI。有一种特殊情况,我希望用户使用主机、用户名和密码登录到服务。然后,向导的其余部分操作此服务以执行各种安装任务。登录可能需要一段时间,尤其是在DNS名称需要很长时间才能解析的错误情况下,或者甚至可能根本无法解析 因此,我的想法是使用registerField机制强制所有三个字段,当用户点击Next时,我们在向导页面上显示一个小提示:“连接到服务器,请稍候…”,同时尝试在后台连接。如果连接成功,我们将进入下一页。如果没有,我们将突出显示有问题的字段,并

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

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

然而,我不知道如何做到这一点。我想到的选择是:

1) 重写validatePage并让它在后台启动一个线程。在validatePage()中输入一个等待,该等待将泵送Qt事件循环,直到线程完成。你会认为这是最丑陋的解决方案,但是

2) 隐藏真正的“下一步”按钮,并添加一个自定义的“下一步”按钮,单击该按钮时,将在线程中调度我的长时间运行的函数,并等待某个对象发出“验证完成”信号。当这种情况发生时,我们手动调用QWizard::next()(并且我们完全绕过validatePage和friends提供的真正验证逻辑)。这甚至更糟糕,但将糟糕之处转移到另一个级别,这可能会使开发更容易


当然有更好的方法吗?

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

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

我最后的选择是#2(覆盖下一个按钮,模拟其行为,但手动捕获其点击事件,并使用它执行我想执行的操作。)编写胶水来定义下一个按钮的行为非常简单,我能够用许多钩子子将QWizardPage子类化,让我在同一个页面上运行我的任务,而不必切换到中间页面,担心是向前还是向后。不过,感谢Caleb的回答。

我的最终选择是#2(覆盖下一个按钮,模拟其行为,但手动捕获其点击事件并使用它执行我想要的操作。)编写胶水来定义下一个按钮的行为非常简单,我能够用许多钩子子将QWizardPage子类化,让我在同一个页面上运行我的任务,而不必切换到中间页面,担心是向前还是向后。谢谢Caleb的回答。

好主意。我会再等一两天再给你其他答案,但你的答案似乎是目前为止最不坏的。我认为这是最好的主意。用户知道发生了什么,在我实现的“魔法”中很好,有一些有趣的状态问题需要手动解决,但它仍然比我在问题中想到的两件事要好。例如,如果您点击第1页上的“下一步”开始连接服务,我们将移动到第2页以显示进度,然后移动到第3页以指示成功。如果用户从第3页返回,我需要第2页跳回第1页。呃(好主意。我会再等一两天再回答,但你的答案似乎是目前为止最不坏的。我认为这是最好的主意。用户知道发生了什么,在“魔法”中也很不错。)我实现了它,有一些有趣的状态问题需要手动解决,但它仍然比我在问题中想到的两件事要好。例如,如果你点击第1页上的“下一步”开始连接到服务,我们将移动到第2页以显示进度,然后移动到第3页以指示成功。如果用户从第3页回击,我将取消编辑第2页跳回第1页。呃:(