使用QNetworkAccessManager :: authenticationRequired和自己的输入窗口小部件/异步

时间:2014-05-13 08:54:10

标签: qt asynchronous pyqt qnetworkaccessmanager qeventloop

我目前正在开发一款带有Qt的浏览器,它有一个类似vim的输入栏:

status bar example

这基本上只是一个QHBoxLayout,其中包含QLineEdit和一些QLabel

现在我想处理HTTP身份验证。我在其他项目中看到的通常情况是打开一个模态QDialog,然后在连接到authenticationRequired signal的插槽内调用exec()

现在我想使用相同的状态栏向用户询问身份验证信息,即显示一些提示,然后使用QLineEdit输入信息。

我的问题是authenticationRequired插槽块,我不能简单地继续在mainloop中运行并继续请求,并在用户完成时添加身份验证信息。

我考虑过两个解决方案:

  • 实现一些函数,在调用QCoreApplication::processEvents时从状态栏获取值,而用户尚未回复。但是我不确定这是不是一个好主意,如果应用程序在我回到真正的事件循环之前会占用大量的CPU。

  • 以某种方式保存并中止请求,要求用户进行身份验证,然后在添加身份验证信息后立即重新创建请求。但似乎我不能简单地克隆QNetworkReply,然后在原始回复中调用abort()并稍后恢复。

看看QDialog::exec() is implemented如何创建一个新的QEventLoop,其中未记录的QEventLoop::DialogExec值已通过。我想知道我是否可以这样做,但是我不确定一旦用户输入在那里我将如何退出事件循环。

这些想法中哪一个听起来最健全?

1 个答案:

答案 0 :(得分:1)

您可以使用QEventLoop而不使用任何特殊的未记录的值。相反,你会有类似的东西:

QEventLoop loop;
connect(editBox, SIGNAL(finishedEditing()), &loop, SLOT(quit()));
loop.exec();

这将启动一个新的事件循环,阻塞,等待你的输入(不会占用尽可能多的cpu作为processEvents)