QtWebkit синхронная загрузка - PullRequest
       11

QtWebkit синхронная загрузка

11 голосов
/ 05 февраля 2010

Я использую QWebPage без QWebView, потому что я хочу визуализировать содержимое файла HTML в QPixmap / QImage.

Я хочу, чтобы загрузка страницы выполнялась синхронно, не асинхронно, что по умолчанию. По умолчанию вызывается QWebFrame::setHtml() или QWebFrame::setContent(), но при этом изображения загружаются асинхронно. Мне нужен какой-то блокирующий вызов функции, например, QWebFrame::waitUntilLoadFinished(), после чего я мог бы просто вызвать render() и покончить с этим.

Я не могу найти способ сделать это. Я что-то упустил?

Ответы [ 4 ]

8 голосов
/ 24 мая 2013

Если кому-то это все еще нужно, вот как я это получил.

mWebPage->mainFrame()->setHtml("...");
QEventLoop loop;
connect(mWebPage,SIGNAL(loadFinished(bool)),&loop,SLOT(quit()));
loop.exec();
/* your webpage has finished loading & is ready to use */
7 голосов
/ 08 февраля 2010

Я предлагаю вам сделать это способом Qt и сделать это асинхронно, это поможет lot .

Если вы все еще хотите сделать это в Sync, используйте QEventLoop в отдельном QThread .

Смотрите мой комментарий для получения подробной информации об использовании QThread. Примечание: не забудьте вызвать moveToThread (); в заголовке потока, или все сигналы будут проходить через цикл выполнения QApplication.

2 голосов
/ 05 февраля 2010

При таком подходе возникает проблема, заключающаяся в том, что вам в основном приходится ждать неопределенное количество времени, и если вы выполняете вызов из основного потока, вы блокируете обработку событий и, таким образом, получаете сигналы типа loadFinished.

.

Хотя вы могли бы обойти это путем явной подкачки события, я не вижу внутренней проблемы, которая могла бы помешать вам выполнить загрузку страницы, и просто выполняла обработку, когда loadFinished произошло.
Если вам нужны вторичные потоки для ожидания страницы, вы всегда можете позволить этим потокам ждать, используя механизмы синхронизации.

0 голосов
/ 05 февраля 2010

Если кому-то интересно, я реализовал это, используя специальный класс PageRasterizer.

Класс создает QWebPage в конструкторе и устанавливает флаг загрузки bool в false.Вызов connect() соединяет сигнал loadFinished со слотом участника, который просто устанавливает флаг загрузки в значение true.

Специальная функция RenderPage(), которая возвращает изображение, выполняет всю работу: она принимает HTMLСтрока и звонки setHtml().После этого следует цикл while, ожидающий флаг;в то время как флаг ложен, вызывается qApp->processEvents(), поэтому сигналы испускаются, и в конечном итоге вызывается слот установки флага.Когда это так, цикл прерывается, и теперь вы можете визуализировать страницу в QImage (не забудьте установить флаг обратно в false перед возвратом).

Если вы заинтересованы в процессе рендеринга, посмотритев этот пример Qt (функция Thumbnailer::render()).

Для бонусных очков вы можете сделать этот класс функтором.

...