0

我正在将内部浏览器从 QtWebKit 移植到 QtWebEngine。

我想要一个在发布一些数据时请求 url 的函数。使用 WebKit,我可以使用以下内容:

使用派生自 QtWebView 的类 WebView :

void WebView::loadPostUrl(const QUrl &url, QByteArray postdata)
{
    m_initialUrl = url;
    QNetworkRequest request = QNetworkRequest(url);
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
    load(request, QNetworkAccessManager::PostOperation, postdata);
}

由于 QtWebEngine 确实与 QNetworkAccessManager 交互,我们如何才能拥有与 QtWebEngine 相同的功能?

谢谢

4

1 回答 1

2

我的解决方案是使用QWebEnginePage::runJavaScript()编写登录脚本,而不是模拟 Post 操作。

QString strLoginScript(
    "var formElts = document.getElementById('formSignIn').elements;"
    "formElts['inputLoginName'].value = '%1';"
    "formElts['inputPassword'].value = '%2';"
    "formElts['btnSignIn'].click();")
    .arg(strUsername)
    .arg(strPassword);

// execute JavaScript code on current page
webEngineView->page()->runJavaScript(strLoginScript);

可选的最后一个参数(此处未显示)是一个 lambda 函数,它在您的 JavaScript 函数退出并接收最后一个值输出时执行。

有关该主题的文档尚不清楚,但我认为该函数从主线程异步执行 - 否则您只会阻止执行并等待,而不是传入可选的 lambda/functor/function-pointer 以便稍后执行。

于 2016-09-30T22:07:20.760 回答