1. На днях понадобилось получать HTML из WebKit (LCL WebKit Demo можно скачать в конце веб-страницы по интернет адресу: http://users.telenet.be/Jan.Van.hijfte/qtforfpc/fpcqt4.html, его и будем изменять).
2. Хоть и написано, что Qt 4.5 и Qt 4.7 бинарно совместимы, но всё же что бы WebKit начал нормально работать (показывать часть изображений) нужно использовать Qt 4.5.3 (релиз октября 2009): http://get.qt.nokia.com/qt/source/qt-win-opensource-4.5.3-mingw.exe.
3. Включим некоторые настройки WebKit:
- Код: Выделить всё
QWebSettings_setAttribute(QWebSettings, QWebSettingsAutoLoadImages, True);
QWebSettings_setAttribute(QWebSettings, QWebSettingsPluginsEnabled, True);
4. Согласно документации нам нужно получить у текущего WebView его страницу и извлечь у данной страницы её фрейм из которой потом можно получить содержимое загруженной в WebView страницы. На C++ это выглядело бы приблизительно вот так:
- Код: Выделить всё
QWebFrame* MyFrame = webView->page()->mainFrame();
5. Первым делом объявим переменную типа QWebFrame, в FreePascal (Lazarus) она имеет дополнительное окончание - H.
На C++ это выглядело бы приблизительно вот так (часть кода из п.4):
- Код: Выделить всё
QWebFrame* MyFrame
6. Получим у текущего WebView его страницу. В изменяемом нами примере необходимо перенести QWebView: QLCLWebViewH из секции private в секцию public класса TWebPanel. Так как в FreePascal (Lazarus) мы обращаемся к библиотеке Qt через стороннюю *.dll то получение свойств класса производится не напрямую, а через специальные процедуры.
На C++ это выглядело бы приблизительно вот так (часть кода из п.4):
- Код: Выделить всё
webView->page()
На FreePascal (Lazarus):
- Код: Выделить всё
QWebView_page(ActiveTab.QWebView);
7. Получим фрейм страницы.
На C++ это выглядело бы приблизительно вот так (часть кода из п.4):
- Код: Выделить всё
MyFrame = webView->page()->mainFrame();
На FreePascal (Lazarus):
- Код: Выделить всё
MyFrame := QWebPage_mainFrame(QWebView_page(ActiveTab.QWebView));
8. Теперь получим HTML.
- Код: Выделить всё
var
FUrl: WideString;
...
QWebFrame_toHtml(MyFrame, @FUrl);
Memo.Lines.Add(UTF8Encode(FUrl));
...
9. Теперь руками можно реализовать диалог сохранения файла и при сохранении скачать и сохранить все дополнительные файлы к HTML в виде изображений, css и т.п.
Надеюсь это кому нибудь пригодиться.