У меня проблемы с QWebFrame::setContent
похоже, что он не может разобрать HTML из qt-project.org пока я не уберу следующий блок из <header>
(он просто останавливается и игнорирует все остальное):
<script type="text/javascript">
function imgFitOnLoad(imgId)
{var maxWidth=720;var img=imgId;var width=img.clientWidth;if(width>maxWidth)
{var sized=maxWidth/width;var height=img.clientHeight*sized;img.width=maxWidth;img.height=height;}}
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-42656244-1']);
_gaq.push (['_gat._anonymizeIp']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga);
})();
</script>
Я протестировал несколько других сайтов (Google, Wikipedia, Youtube, GNU, …), но не смог воспроизвести проблему. Минимальный (не) рабочий пример:
// MainWindow.cpp
#include "MainWindow.hpp"
#include <QDebug>
#include <QFile>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QWebPage>
#include <QWebFrame>
#include <QWebElementCollection>
MainWindow::MainWindow(QWidget *parent) :
QWidget(parent), mgr{}
{
connect(&mgr, SIGNAL(finished(QNetworkReply*)), this, SLOT(test(QNetworkReply*)));
// unmodified -> assert fails
mgr.get(QNetworkRequest{QUrl{"http://qt-project.org/"}});
// modified -> assert passes
// mgr.get(QNetworkRequest{QUrl{"https://gs93.de/tmp/qtprojectdump-mod.html"}});
}
void MainWindow::test(QNetworkReply* reply)
{
qDebug() << __PRETTY_FUNCTION__;
Q_ASSERT(reply->error() == QNetworkReply::NoError); // just to be sureauto data = reply->readAll();
QFile file("orig.html");
if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
QTextStream stream(&file);
stream << QString{data};
}
QWebPage page;
page.mainFrame()->setContent(
data,
reply->header(QNetworkRequest::QNetworkRequest::ContentTypeHeader).toString());
QFile file2("page.html");
if (file2.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
QTextStream stream(&file2);
stream << page.mainFrame()->toHtml();
}
Q_ASSERT(page.mainFrame()->findAllElements("a").count() > 0); // unmodified version fails here
}
MainWindow::~MainWindow()
{
}
а также
// MainWindow.hpp
#ifndef MAINWINDOW_HPP
#define MAINWINDOW_HPP
#include <QWidget>
#include <QNetworkAccessManager>
class QNetworkReply;
class MainWindow : public QWidget
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
QNetworkAccessManager mgr;
public slots:
void test(QNetworkReply* reply);
};
#endif // MAINWINDOW_HPP
составлено с
QT += webkitwidgets
CONFIG += c++11
Я использую Qt 5.2.1. Это ошибка на моей стороне или на стороне QtWebKit?
Задача ещё не решена.