【问题标题】:Using QNetworkAccessManager::authenticationRequired with own input widget / asynchronously使用 QNetworkAccessManager::authenticationRequired 和自己的输入小部件/异步
【发布时间】:2014-05-13 08:54:09
【问题描述】:

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

这基本上只是一个QHBoxLayout,里面有一个QLineEdit和一些QLabels。

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

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

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

我想过两种解决方案:

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

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

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

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

【问题讨论】:

    标签: qt asynchronous pyqt qnetworkaccessmanager qeventloop


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-05-25
      • 2012-11-13
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-18
      相关资源
      最近更新 更多