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

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

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

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

11
задан Lucas 5 February 2010 в 14:32
поделиться

3 ответа

Если кому интересно, я реализовал это с помощью специального класса «PageRasterizer».

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

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

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

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

0
ответ дан 3 December 2019 в 07:12
поделиться

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

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

2
ответ дан 3 December 2019 в 07:12
поделиться

SVN знает, что произошло изменение в репозитории, но не знает, что это за изменения. Возможно, вы внесли то же самое изменение в свою рабочую копию, но если вы на самом деле не попытаетесь сделать обновление, чтобы SVN мог выполнить разрешение, оно не будет проверять, что ваше локальное изменение совпадает с изменением репо.

Обновите svn , и разрешение конфликта должно быть автоматическим. Однако, если вы внесли изменения в те же самые файлы, может потребоваться разрешить их вручную, даже если это точно такое же изменение (даже более вероятно, если это изменение было переименованием папки)

Возможно, потребуется также svn resolved для принудительного разрешения конфликтов вручную.

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

-121--3842590-

Не уверен, что я понимаю ваш вопрос, но попробуйте это:

DropDownList1.ClearSelection()

или

DropDownList1.SelectedIndex = -1;
-121--3509307-

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

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

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

7
ответ дан 3 December 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: