Итак, как оказалось (в ходе экспериментов и изучения доков, за что sendevent отдельно спасибо) qt webkit позволяет кидать результаты работы js-скриптов прямо в ваш какой-либо qt-класс. Моя задача - найти все ссылки на странице, с учётом ссылок, сформированных яваскриптом, что очень важно - была решена след. образом:
Java
this.webview = new QWebView(Form);
this.webview.load(new QUrl("http://google.ru"));
//при окончании загрузки страницы работаем со слотом, извлекающим ссылки
this.webview.loadFinished.connect(this, "func()");
this.webview.setVisible(true);
public final void func()
{
//дочерние фреймы страницы, если есть
List<QWebFrame> framesList = this.webview.page().mainFrame().childFrames();
//главный фрейм
framesList.add(this.webview.page().mainFrame());
/*собственно js-код, извлекающий ссылки, метод возвращает строку с разделителями, которая подвергнется дальнейшей обработке уже со стороны qt-инструментария*/
String script = "function getAllLinks(){var res;for (i=0;i<document.links.length;i++){res += document.links[i].href + '[LINKS_SEPARATOR]';}return res.substring(0, (res.length - 17));}getAllLinks();";
//перебор всех фреймов и извлечение из каждого набор ссылок
Iterator iter = framesList.iterator();
while(iter.hasNext())
{
QWebFrame frame = (QWebFrame) iter.next();
this.resString += frame.evaluateJavaScript(script);
}
//вывод в консоль результирующей строки ссылок с разделителями
System.out.println(this.resString.substring(13, this.resString.length()));
}
Примерно такой же сишный код (автор sendevent):
C
QList<QWebFrame *> framesList = getView()->page()->mainFrame()->childFrames();
framesList.prepend( getView()->page()->mainFrame() );
QString script = "function getAllLinks(){var res;for (i=0;i<document.links.length;i++){res += document.links[i].href + '[MY_LINKS_SEPARATOR]';}return res;}getAllLinks();";
QString resString;
foreach( QWebFrame *pCurrentFrame, framesList )
{
resString += pCurrentFrame->evaluateJavaScript( script ).toString();
}
QStringList resStringList = resString.split( "[MY_LINKS_SEPARATOR]", QString::SkipEmptyParts, Qt::CaseInsensitive );
qDebug( "finded %d links:", resStringList.size() );
foreach( QString link, resStringList )
{
qDebug( "link: %s", qPrintable( link ) );
}
Таким же образом можно выудить все картинки, тексты и др. информацию сформированную javascript'ом и не только. Полезным при такой проблеме также может стать метод addToJavaScriptWindowObject(), делает обратное: qt->js