Qt - QWebView 问题

Posted

技术标签:

【中文标题】Qt - QWebView 问题【英文标题】:Qt - QWebView Problem 【发布时间】:2010-12-24 19:42:29 【问题描述】:

我有一个由 QWebView 小部件组成的 PyQt gui 脚本。我正在尝试发送 GET 请求,即转到页面,填写表格并使用此问题底部的代码单击单击。

由于我正在处理 webview 的 documentElement(a QWebElement),我需要将所有 DOM 操作放在一个单独的函数中(我将其命名为 fillForm)并将 loadFinished() 信号连接到函数中。如果不连接信号,文档将无法加载,我将无法获取我想要的元素。

我能够正确提交表单并从网页中获得正确的响应。

我遇到的问题是,上述导致一种无限循环。这是因为每次加载新页面时都会重新加载网页,因此每次都会填写表单而不会停止。

我想知道是否有某种方法可以确定 WebView 的页面是否已完全加载、非异步加载,或者是否暂停脚本的执行(不冻结 gui),直到整个文档加载完毕。我无法为这个问题想出一个令人满意的解决方案(我的想法包括保持一个全局变量来跟踪点击)。如果有人能用更好的方法帮助我解决这个问题,我将不胜感激。谢谢!

这是我正在使用的代码

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *
from PyQt4 import QtCore

app = QApplication(sys.argv)
web = QWebView()
web.load(QUrl("http://mywebsite.com"))

def fillForm():
    doc = web.page().mainFrame().documentElement()
    searchform = doc.findFirst("input[type=text]")
    searchform.setAttribute("value", "hello")
    button = doc.findFirst("input[type=submit]")
    button.evaluatejavascript("click()")

QtCore.QObject.connect(web, QtCore.SIGNAL("loadFinished"), fillForm)
web.show()
sys.exit(app.exec_())

【问题讨论】:

【参考方案1】:

构建“网络机器人”的同样问题

我发现这个解决方案使用attesaLoop.exec(); 暂停所有,webView_loadFinished 在页面加载文件时恢复执行

在头文件中声明

#include <QEventLoop>
QEventLoop attesaLoop;

在功能代码中

void MainWindow::naviga()

  //--webView--webPage--webFrame--//--QWebElement--//
  indirizzo = "http://www.google.it";
  ui->webView->load(QUrl(indirizzo));

  attesaLoop.exec();

  ui->listWidget->addItem("fine caricamento");
  frame = ui->webView->page()->mainFrame();
  documento = frame->documentElement();
  formInput = documento.findFirst("input[name=q]");
  formInput.setAttribute("value","hallo");
  bottone = documento.findFirst("input[type=submit]");
  bottone.evaluateJavaScript("this.click()");

  attesaLoop.exec();


void MainWindow::on_webView_loadFinished(bool)

  //ui->listWidget->addItem(indirizzo);
  attesaLoop.exit();
  //esegui e;
  //e.cerca(documento);

【讨论】:

谢谢!这对我有用,但我不得不使用 exec_() 方法,因为它是 pyqt。

以上是关于Qt - QWebView 问题的主要内容,如果未能解决你的问题,请参考以下文章

Qt:QWebview 不在另一台机器上显示 jpg、gif、png 图像

QT 从 QWebView 的 QNetworkAccessManager 读取数据

Qt:在 QWebView::linkClicked(QUrl) 上响应时出现问题 - 插槽信号问题

在 Qt 中,QWebView 和 QNetworkRequest 不能共享 cookie

QWebView使用

QWebView 类是不是在 Qt 5.0.0 中工作?