2014-05-13 18 views
0

我目前正在開發使用Qt瀏覽器具有VIM般的輸入欄:使用QNetworkAccessManager :: authenticationRequired與自己的輸入控件/異步

status bar example

這基本上是一個QHBoxLayoutQLineEdit還有一些QLabel在裏面。

現在我想處理HTTP身份驗證。我在其他項目中看到的通常情況是打開模式QDialog,然後在連接到authenticationRequired signal的插槽內對其調用exec()

現在我想使用相同的狀態欄來詢問用戶認證信息,即顯示一些提示,然後使用QLineEdit輸入信息。

我的問題是authenticationRequired插槽塊,我不能簡單地繼續在主循環中運行,並繼續添加用戶完成時添加的驗證信息的請求。

我想過兩種解決方案:

  • 實現一些功能,同時呼籲QCoreApplication::processEvents儘管沒有來自用戶的回覆尚未從狀態欄得到的值。然而,我不確定這是否是一個好主意,並且如果應用程序會佔用大量CPU,直到我回到真正的eventloop。

  • 以某種方式保存和中止請求,要求用戶進行身份驗證,然後在添加身份驗證信息後立即重新創建請求。但似乎我不能簡單地克隆QNetworkReply,然後在原始答覆上致電abort()並稍後恢復。

如何QDialog::exec()is implemented似乎他們創建一個新的QEventLoop與傳遞的QEventLoop::DialogExec無證價值展望。我想知道如果我能做同樣的事情,但是我不確定一旦用戶輸入那裏,我將如何退出事件循環。

這些想法聽起來是最理智的嗎?

回答

1

您可以使用QEventLoop而不使用任何特殊的未公開的值。相反,你會碰到這樣的:

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

這將啓動一個新的事件循環阻塞,等待你的輸入(不佔用盡可能多的CPU爲processEvents)