【问题标题】:QtWebEngine : Load URL with HTTPPostQtWebEngine : 使用 HTTPPost 加载 URL
【发布时间】:2016-05-08 09:12:05
【问题描述】:

我正在将内部浏览器从 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 相同的功能?

谢谢

【问题讨论】:

  • 你可以让它加载一个网页,然后依次执行 POST 请求。
  • 我的 QT 应用程序具有要发布到该 URL 的参数值。所以你想让我用 GET 中的这些参数调用另一个 url,然后用 POST 调用主 URL?
  • 这是一种方法。另一种方法是通过 WebSockets 将数据发送到页面。
  • 所有这些方法都需要访问和修改我不想做的服务器端。
  • 关于使用 QWebEngine 发布的任何消息?我在将 QWebView::load() 调用移植到 QWebEngine 时遇到同样的问题 ...

标签: qt qtwebengine qtwebview


【解决方案1】:

我的解决方案是使用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 以便稍后执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 2018-02-12
    • 1970-01-01
    • 2015-05-26
    • 2015-10-21
    • 1970-01-01
    • 2015-07-04
    相关资源
    最近更新 更多