C++ Qt-QWebView问题

C++ Qt-QWebView问题,c++,qt,pyqt4,signals-slots,C++,Qt,Pyqt4,Signals Slots,我有一个PyQtGUI脚本,它由一个QWebView小部件组成。我正在尝试发送一个GET请求,即转到一个页面,填写表单,然后使用问题底部的代码点击 因为我处理的是webview的documentElement(一个QWebElement),所以我需要将所有DOM操作放在一个单独的函数中(我将其命名为fillForm),并将loadFinished()信号连接到该函数中。如果不连接信号,文档将无法加载,我将无法获得所需的元素 我能够正确提交表格,并从网页上得到正确的回复 我遇到的问题是,上面的问题

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

因为我处理的是webview的documentElement(一个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_())

建造“网络机器人”也有同样的问题

我使用
attesaLoop.exec()找到了这个解决方案
暂停所有,并
webView\u loadFinished
在页面加载文件后恢复执行

在头文件中声明

#include <QEventLoop>
QEventLoop attesaLoop;

谢谢这对我很有用,但我不得不使用exec_qt()方法,因为它是pyqt。
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);
}