0

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

状态栏示例

这基本上只是一个QHBoxLayout带有 aQLineEdit和一些QLabels 的 a 。

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

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

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

我想过两种解决方案:

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

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

看看是如何QDialog::exec() 实现的,他们似乎创建了一个QEventLoop带有未记录值的新值QEventLoop::DialogExec。我想知道我是否可以做同样的事情,但是我不确定一旦有用户输入,我将如何退出事件循环。

这些想法中哪一个听起来最理智?

4

1 回答 1

1

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

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

这将启动一个阻塞的新事件循环,等待您的输入(不会像 processEvents 那样占用过多的 cpu)

于 2014-05-13T12:02:27.297 回答