我目前正在开发一款带有Qt的浏览器,它有一个类似vim的输入栏:
这基本上只是一个QHBoxLayout
,其中包含QLineEdit
和一些QLabel
。
现在我想处理HTTP身份验证。我在其他项目中看到的通常情况是打开一个模态QDialog
,然后在连接到authenticationRequired signal的插槽内调用exec()
。
现在我想使用相同的状态栏向用户询问身份验证信息,即显示一些提示,然后使用QLineEdit输入信息。
我的问题是authenticationRequired插槽块,我不能简单地继续在mainloop中运行并继续请求,并在用户完成时添加身份验证信息。
我考虑过两个解决方案:
实现一些函数,在调用QCoreApplication::processEvents
时从状态栏获取值,而用户尚未回复。但是我不确定这是不是一个好主意,如果应用程序在我回到真正的事件循环之前会占用大量的CPU。
以某种方式保存并中止请求,要求用户进行身份验证,然后在添加身份验证信息后立即重新创建请求。但似乎我不能简单地克隆QNetworkReply
,然后在原始回复中调用abort()
并稍后恢复。
看看QDialog::exec()
is implemented如何创建一个新的QEventLoop
,其中未记录的QEventLoop::DialogExec
值已通过。我想知道我是否可以这样做,但是我不确定一旦用户输入在那里我将如何退出事件循环。
这些想法中哪一个听起来最健全?
答案 0 :(得分:1)
您可以使用QEventLoop而不使用任何特殊的未记录的值。相反,你会有类似的东西:
QEventLoop loop;
connect(editBox, SIGNAL(finishedEditing()), &loop, SLOT(quit()));
loop.exec();
这将启动一个新的事件循环,阻塞,等待你的输入(不会占用尽可能多的cpu作为processEvents)