Гибридные приложения в Qt на примере использования D3.js

Гибридные приложения в Qt на примере использования D3.js

QtWeb - это лёгкий и быстрый кроссплатформенный браузер, имеющий несколько уникальных возможностей.

QtWeb позволяет в один клик убрать с экрана все панели браузера, оставив лишь саму просматриваемую веб-страницу. Кроме того, браузер имеет встроенную виртуальную клавиатуру, позволяет на лету переключать стиль и увидеть, как выглядит сайт в другой операционной системе (Unix/Linux или другой версии Windows).

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

Особое внимание в QtWeb уделено безопасности и конфиденциальности. Имеется специальный Защищённый режим (Private Browsing), позволяющий не оставлять никаких следов интернет-серфинга, как на локальном компьютере (куки, кэш), так и в сети (например, даже UserAgent может быть подменен).

Имеющаяся функция полного ресета сбрасывает все данные, очищает кэши и восстанавливает все настройки в исходное состояние - какими они были до момента первого запуска QtWeb на данном ПК. Поддерживает SSL и HTTPS. При этом отображает полную информации о сертификате сайта. Как и положено любому современному браузеру, QtWeb поддерживает фреймы, JavaScript, Cookies, Закладки, историю, пароли и работу с медиа-контентом. Также поддерживает автозаполнение форм - можно использовать для запоминания и заполнения логинов и паролей для сайтов, которые вы посещаете чаще всего.

Кроме того, работает с плагинами Netscape, Adobe Flash Player, QuickTime и MediaPlayer. Может работать из командной строки с поддержкой параметров. Не требует установки и может запускаться с любого сменного носителя. QtWeb базируется на открытых библиотеках Qt и движке WebKit, используемом в браузерах Apple Safari и Google Chrome. Имеет многоязычный интерфейс.

Вопрос: HTML браузер с QT на c++


Народ, помогите пожалуйста. Предпод поставил задачу всей группе:"Написать свой браузер на c++, используя только библиотеки стандартные qt и c++ , без готовых решений и WebKit"а"(p.s. только на 2й курс перешли). Инфы нам не дали никакой, ни с чего начать, ни хотя бы какой нибудь принцип действий. В общем как это реализовать?? Есть пока что только получение исходного кода с сайта и все, дальше ступор. Если можно какие то примеры, что бы было понятно. Надеюсь кто-то это увидит. Нужно просто интерпритировать и отрисовывать html станички, без css, js и т.п.

Ответ: видимо 4й стандарт,отрисовать в окно программы

Вопрос: Управление HTML страницей javascript-ом через локальное приложение


Здравствуйте, уважаемые форумчане. Надеюсь у вас всех хорошее настроение и этот день вы провели отлично.

У меня возник вопрос. Может кто поможет советом и направит в нужную сторону.

Ситуация такая. Есть javascript код который управляет страницей браузера по определенному адресу. Проще говоря есть userscript выполняющий то, что от него требуют и там где от него это требуют.

Дело происходит так. Открываю я браузер и начинает работать сам userscript.

Вопрос :
Как и можно ли вообще засунуть этот userscript в программу и так что бы он продолжал выполнять свою работу? И выполнял так будто он исполняется в самом браузере.

Варианты :
1)Программа открывает браузер у клиента и запускает userscript. (Если это браузер Opera, то программа должна создать папку в programfiles\opera и создать там файл с userscript-ом. Затем настроить саму оперу (прописать путь до скрипта). После того как программу пользователь закроет, скрипт из папки удаляется)
2)Если брать Portable версию допустим той же оперы, то тогда программа открывает эту оперу и проделывает теже действия что и в пункте 1). (Можно ли сделать так чтобы portable версию не было видно, а было видно только программу?)
3)Программа имитирует браузер таким образом, что бы сайт думал, что открылся именно браузер допустим всё той же оперы.(Как сделать имитацию браузера? На что стоит обратить внимание?). Подойдет ли для этих целей или другое решение из этой статьи

Вот в принципе всё, что мне пришло на ум.
Повторю ключевые моменты, которыми должна обладать программа:
1)Выполнять код из userscripta
2)Имитировать браузер
3)Вся эта задумка с программой пришла на ум, чтобы скрыть javascipt код. Если как то это можно сделать другими средствами, то посоветуйте, пожалуйста.

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

Сделаю оговорку. Так как мне не известно какие средствами лучше выполнить эту задачу и я знаком с C# на уровне лабораторных работ, то мой выбор в какой теме отписаться пал на C#. Если эту задачу можно выполнить другими языками программирования, то прошу скажите об этом.

Спасибо.

Ответ:

Сообщение от IliyaGood

Как и можно ли вообще засунуть этот userscript в программу и так что бы он продолжал выполнять свою работу? И выполнял так будто он исполняется в самом браузере.
Понятия не имею как это можно сделать. Но есть варианты как должно это выглядеть.

Помойму все просто, даете клиенту на запрос html страницу со скриптом, а скрипт дальше уже сам работает
почему не подходит?

Сообщение от IliyaGood

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

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

Вопрос: Открытие html страницы


Как открыть html страницу через button в браузере гугл?

Ответ: Если код html-страницы задается в программе, то:

Если html-файл уже сохранен где-то, то:

Если никакого html-файла нет, а нужно просто открыть какую-то страницу в браузере, то:

Код Delphi

Вопрос: Код страницы html различается в браузере и программно


Приветствую! При просмотре кода страницы с хрома есть такие строки

Но когда получаю страницу программно, то этих строк нет, получаю просто страницу

HTML5
1 2 3 4 <h1 > Not Found (#404)</ h1 > <div class = "alert alert-danger" > Страница не найдена. </ div > <p >

Пробовал и post-запрос отправлять с хедерами, но тоже толку нет.

XML
1 2 3 4 .setRequestHeader "Content-Type", "application/x-www-form-urlencoded" .setRequestHeader "Cache-Control", "Max-age=0" .setRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36"

Есть мысли что делать? Или вся хитрость в d81a3234cefa30b1?

Ответ: Roman_rc , это не КОСЯЧНАЯ ссылка, это работающая ссылка. Была когда то. В этом то и вопрос заключался.
Т.е. ссылка на конкретный товар (а не на категорию, как вы указали в примере) на разных браузерах (и по времени) различается. И различается она именно в этом наборе букв/цифр.
Мне надо программно мониторить ежедневно конкретный товар.
Значит надо такую ссылку, которая откроет страницу товара с любого браузера или в любое время.

Добавлено через 5 часов 11 минут
А вот ссылка вроде работает...
Roman_rc , благодарю за наводку, обратил внимание на product, заменил на catalog, msgbox выдал ОК)

Вопрос: Как открыть файл html локально заданным браузером?


Здравствуйте.
Подскажите, как с гугл хрома открыть файл html локально.
Пробовал открыть.

В TextBox1 должен находится ваш адресс к браузеру!

Вопрос: Создание HTML/JS C# приложения


Доброго времени суток уважаемые!

Возникла необходимость, написать кроссплатформенное настольное приложение. С "красивой мордой". Как известно, WPF под Mono"й работает плохо (в основном, никак), а вот, WinForms и компонент WebBrowser"а -- работают весьма и весьма неплохо.

В результате чего, родилась следующая идея:
1. В качестве морды - используем WinForm"у + WebBrowser
2. ?
3. В качестве реализации логики приложения - используем "Pure C#"

И но тут не хватает, как Вы могли заметить, не хватает промежуточной составляющей, т.н. "прокладки", между браузером и C#-кодом. В классическом варианте, эту роль выполняет HTTP- сервер/протокол, но т.к. у нас стоит стоит задача разработки не сайта или сервиса, то клиент-серверную составляющую, из этой цепочки нужно выкинуть, как HTTP-* так и сокеты вообще, какие бы то ни было, в виду их нецелесообразности.

Собственно, вопрос:
Как правильно отделить мух от котлет, и есть ли какие-то уже готовые решения, для реализации подобных связей? Я не знаток ASP.net, но уверен, что там имеется возможность, задать какой-то глобальный роут по умолчанию, который в зависимости от URL"а будет выбирать нужный контроллер и метод, передавая в него соотв. параметры, предварительно превращая их с C#-удобоваримый вид (C#- переменные/массивы/объекты). Хочу что-нибудь в таком же духе, что бы не плодить все эти вариации связей и локального роутинга самому.

Благодарю за внимание.

Добавлено через 6 минут
P.S. Мы конечно, можем, написать консольное приложение, морда которого будет работать в браузере, а само приложение - выступать в роли HTTP-сервера, но эта идея мне не очень нравится по следующим основным причинам:

1. Открытие сокета в режиме прослушивания (сервера) -- требует дополнительных прав под Windows
2. Для каждого такого приложения придётся искать свой, не занятый ранее кем-то сокет, со всеми вытекающими
3. Разбивать приложение на две слабо связанные части, обрабатывать "руками" HTTP-запросы и т.д. - всё это не лучшие идеи в данном случае

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

C#
1 2 3 4 using (WebClient client = new WebClient() ) { string htmlCode = client. DownloadString (ur) ; }

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

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

Вопрос: Парсинг html + javascript


Доброго времени суток!

Я хочу написать парсер, чтобы получать нужную информацию с сайта для дальнейшей работы с ней. Начал изучать, нашел множество примеров, которые внятно поясняют, что и как делать, но не подходит для моего варианта. Проблема в том, что информация, которая нужна мне, выводится через javascript и при парсинге страницы, парсится все, кроме таблицы с нужной информацией (вместо нее надпись "Loading..."). Как решить данную проблему, поделитесь знаниями и опытом?

P.S. Сайт получает информацию поэтапно, как я понял, прочитав пару тем.
Есть парсер этого сайта для Excel, и там такой метод получения (нужной мне) информации, в три этапа:

1. "Открыть сайт site.ru в IE",
2. "Прокрутить страницу вниз"
3. "Закрыть IE".

Для удобства есть окошко с кодом, полученным с сайта, в нем есть весь код в html, даже тот, что получается через javascript.

Если есть подобные команды для c#, php, буду очень признателен.

P.P.S. Язык программирования по сути не важен, но отдаю предпочтение C# дабы парсер был в виде *.exe программы с выводом данных в Excel или txt.

P.P.P.S Извиняюсь за такой фанатизм к описанию данной темы. Самое главное - как мне получить эту информацию, есть ли варианты, как в Excel парсере?

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

P.s. лучше смотреть сначала из network в любом браузере.

Updated - September 7, 2018 by

There are many web browsers around here for GNU/Linux, from few Kilobytes to few several hundred Megabytes. So what"s special here ? We are talking about lightweight Qt browser for UNIX like systems.

They"re built with Webkit rendering engine and Qt toolkit for the GUI.

Why webkit ? It"s the most widely used, most widely deployed and easy to integrate web content rendering engine. Even the blink rendering engine is webkit based. It"s open source too!

Why Qt ? The Qt toolkit is open source, versatile and easy to integrate in almost any GUI application. Qt widget style is and pleasant looking too. Or merely could be personal choice, some people prefer Qt over GTK+ .

Let"s start, the main focus is being lightweight, but it should provide the basic features of a web browser.

1. Falkon/Qupzilla, a lightweight Qt web browser

Qupzilla started just as a research project, initially coded in Python PyQt now available in both Qt 4 and Qt 5 . It"s a fully featured browser with fast browsing and lots of settings to play around.

And now the version 2.x is renamed to Falkon , based on QtWebEngine.

You can change otter browser"s appearance with .

3. Arora, lightweight Qt browser

That"s another cross platform Qt browser , based on Qt4 with advanced features like user agent switcher, integrated Ad blocker, export web pages as PDF, page source analyzer etc. etc.

Pre-compiled binary packages are available in most GNU/Linux distribution"s software repository. Official website github.com/arora/arora .

At present Arora development is somewhat stalled, available only in Qt 4.

Still Arora is usable enough, specially if you build it from source.

4. Slimboat Qt browser

UPDATE: Slimboat development stalled, don"t use it.

Slimboat is a cross platform freeware web browser, not an open source software, available as precompiled binaries. It"s based on Qt 4 and Webkit with small memory usage. Now It"s outdated, the project updated to slimjet, which is based on blink rendering engine.

5. WCGBrowser

This is a qt browser is written in python and PyQtWebkit, written by Alan D Mmoore to be used as a kiosk browser.

It is highly configurable and very lightweight on system resources. It"s simply amazing, download it and find more about it

Conclusion

You could use those lightweight webkit based browsers as simple HTML viewer, all of them also supports mhtml web archive. Another distinct advantage is they starts very fast compared to other browsers like or Firefox.

This is a very comprehensive list, there are other Qt and webkit based browsers are around, some of them may be even better than those listed above.

Suggestions are always welcome, please let us know about your thoughts on those Qt browser. Don"t forget to share this with friends !

Your comments

    Erwin says

Песочница

рыцарь со стволом 5 января 2011 в 18:19

Знакомство с браузером QtWeb

  • Чулан *

Предисловие
Сейчас на рынке браузеров идет сильная борьба. Производители вводят все новые и новые фишки, начинают использовать вычисления видеокарты для рендинга. Сайты становятся тяжелее: флеш, огромное количество картинок, тяжелая анимация. В результате если вы не обновляли своего железного коня, даже обычный серфинг сопровождается фризами или подвисаниями. А если компьютеру 10 лет и более? Вот как раз такое старое бесхозное железо досталось мне. Но интернет там нормально посещать было невозможно. Гиганты рынка браузеров нещадно тормозили и переодически падали, donut зависал на втрой вкладке. Возможно выновато время плачевно отразившиеся на железе, вызывая дичайшие ошибки. Но выяснить проблему не удалось, а нетмамонта хотелось. И тут на сцену выходит QtWeb.

Немного описания
В интернете о нем чрезвычайно мало информации, лишь упоминание в wiki. На официальном сайте говориться, что это легкий, безопасный браузер использующий webkit и имеющий уникальный интерфейс. На счет легкости они правы. Браузер весьма неплохо себя чувствует на процессоре 14 летней давности(pentium 2 400 Mhz) и при этом очень стабилен. Даже надежный Firefox периодически падал на двух вкладах. Лишь на десяти вкладках зависает, памяти мало все таки. Уникальный внешний вид далеко не так уникален как говориться. Посмотрите сами:

Хотя панель закладок весьма удобна на широкоэкранном мониторе. Интерфейс написан с использованием библиотек QT.
Одна из интересных фич это быстрая смена индифактора браузера. Движок же для рендинга не меняется, тот же webkit. Хотя ошибки на некоторых сайтах пропадают.

Меню выбора:

Внутри можно найти встроенный adblock но без правил, куда их можно скормить найти не удалось. Остается лишь только обучение вручную. Поддержка прокси есть, причем собственная. Не костыль через IE как в chrome(на мой взгляд).

А вот вклада безопасность меня удивила:

Для активации (деактивации) достаточно обновить страницу. Верстка от этого не страдает. Очень удобно, еще бы фильтр ко всему этому…

Еще есть встроенный торрент клиент. Функционал маленький, но иметь под боком приятно. К сожалению не отключается и перехватывает файлы. С magnet не дружит…

Но гораздо больше мне понравилось совсем другое. Возможность сохранять страницу в pdf. Я пока не видел не в одном браузере за исключением связки firefox+плагин. Это очень удобно. Например сохранить интересную и большую статью, а потом читать на электронной читалке или телефоне. Верстка немного страдает, да и текст не является текстом, делается что то вроде скриншота. Вес сохраненный страницы вполне приемлемый. Любимая хабра в pdf весит 483 кб.

На взгляд загружает страницы очень быстро. Поддержка html5 весьма и весьма посредственная. Но для технической части есть тесты.

Тестирование
html5test.com - 155/300
Acid3 - 100/100
Sputnik от google: 164 ошибки

На официальном сайте есть таблица сравнения с другими браузерами.

С открытым Яндексом занимает 13 мб от ОЗУ, с пятью вкладками яндекса 68. Для сравнения google chrome c одной вкладкой 14, а с пятью 79.

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

Если кому интересно вот железо на котором он сейчас используется: Pentium 2 400 Mhz, 128 mb Dimm, Nvidia MX 440. И конечно основным браузером на личном компьютере на котором проводились тесты.

P.S. К сожалению я не знаю по каким тестам следует гонять браузеры для проверки. Если есть предложения пишите. С удовольствием протестирую.

Теги: браузеры, тестирование, webkit, qt

  • Программирование ,
  • C++ ,
  • Визуализация данных
    • Tutorial

    Для JavaScript-программистов хорошая новость заключается в том, что их решения можно легко интегрировать в Desktop приложения, что потенциально может увеличить целевую аудиторию пользователей разрабатываемых библиотек (во всяком случае это верно для мира Qt приложений).

    На скриншоте ниже изображен виджет Dependency Wheel (Круг Зависимостей), отрисовка которого осуществляется с помощью D3.js а управление данными и отображением - с помощью Qt. При нахождении указателя над соответствующей дугой её взаимосвязи «подсвечиваются», а остальные становятся полупрозначными. Данный виджет можно использовать для визуализации различного рода зависимостей (например библиотек).

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

    Статья больше ориентирована на Qt-программистов, но также может быть интересна и JS программистам.

    Идея гибридных приложений

    Отправной точкой идеи гибридных приложений является ряд ограничений, присущих нативным приложениям:
    • дополнительные расходы по внедрению и сопровождению клиентских частей системы;
    • написание уникального интерфейса пользователя порой является нетривиальной задачей;
    • невозможность повторного использовать API существующих веб-приложений.
    Гибридные приложения решают эти проблемы за счет того, что:
    • развертывание выполняется как в веб приложениях;
    • сложные интерфейсы создаются с использованием web-технологий (HTML, CSS, SVG, Canvas);
    • повторно используется API существующих веб-приложений.
    Архитектура гибридных приложений предполагает, что
    • Qt-приложение выступает в роли браузера;
    • взаимодействие с пользователем и логика приложения программируется в JavaScript;
    • дополнительная функциональность реализуется на С++ в Qt-части приложения.
    Таким образом гибридные приложения реализуют идею тонкого клиента.
    Одним из примеров гибридных приложений в Qt является WebKit Image Analyzer .

    В примере, рассматриваемом в статье, будет использована только часть подхода гибридных приложений: отображение компонента за счет JavaScript. При этом все необходимые JS файлы будут расположены в ресурсах, как в классическом StandAlone приложении (автономном и не требующем для работы подключения к интранет/интернет сети).

    Структура проекта

    Общая структура файлов проекта изображена на рисунке:

    В директории base находятся:

    • d3viewer.h и d3viewer.cpp - определение и реализация базового класса-вьювера D3Viewer , наследованного от QWidget QWebView .
    • d3webpage.h и d3webpage.cpp - определение и реализация D3WebPage - наследника QWebPage (для поддержки вывода сообщений об ошибках и отладочной информации в QWebPage::javaScriptConsoleMessage ).
    В директории charts/pie:
    • dependencywheelwidget.h и dependencywheelwidget.cpp - определение и реализация базового класса-вьювера, наследованного от QWidget и инкапсулирующего взаимодействие с QWebView .
    Директория resources поделена на две: js и html. В html находится та страница, которая будет загружаться в виджете и в которой находится весь код взаимодействия с Qt, в js - необходимые для работы DependencyWheel js-файлы: общий для D3 - d3.min.js и специфичный для примера - d3.dependencyWheel.js.

    Диаграмма классов

    Для того, чтобы сократить объем статьи средствами VisualParadigm была создана простая диаграмма: в ней опущены атрибуты и методы классов, которые не имеют прямого отношения к описываемой технологии. Детали реализации можно узнать в исходниках, ссылка на которые находится в конце статьи.

    Взаимодействие Qt <-> JS

    В гибридных приложениях в JavaScript внедряется специальный объект, вызов методов которого обрабатывается на стороне Qt:

    Void D3Viewer::addContextObject(const QString &name, QObject *object) { frame()->addToJavaScriptWindowObject(name, object); //frame() - QWebFrame }
    Этот метод вызывается в производных от D3Viewer классах в конструкторе перед загрузкой страницы:

    1. Посредством обращения к свойствам объекта.
      для этого необходимо определить свойство в объекте, который является контекстным объектом в JS («api»):

      Public: Q_PROPERTY(float padding READ padding WRITE setPadding) public slots: float padding(); //getter void setPadding(const float padding); //setter
      После этого можно обращаться к данным свойствам из JS:

      Var chart = d3.chart.dependencyWheel() .width(api.width) .height(api.height) .margin(api.margin) .padding(api.padding);

    2. Обработкой сигналов Qt в JS, для этого в JS необходимо подключить соответствующую функцию-обработчик к сигналу.

      Api.update.connect(redraw);

    3. Вызовом слотов Qt в JS, например при обработке клика по элементу:

      G.append("svg:path") .style("fill", fill) .style("stroke", fill) .attr("d", arc) .on("mouseover", fade(0.1)) .on("mouseout", fade(1)) .on("click", function (d) { api.itemClicked(packageNames) }); //здесь подключается обработчик

    4. Вызовом других методов Qt в JS, для этого объявление метода нужно предварить макросом Q_INVOKABLE.

      Q_INVOKABLE void thisMethodIsInvokableInJavaScript();

    5. Непосредственным исполнением JS-кода.

      Void D3Viewer::evaluateScript(const QString &script) { frame()->evaluateJavaScript(script); }

    В примере способы 4 и 5 не используются

    Отладка JavaScript в гибридном приложении

    Для отладки JS приложения (как и обзора DOM, просмотра сетевой активности, загружаемых ресурсов и т.д.) в конструкторе D3Viewer необходимо установить следующее свойство:

    #ifdef QT_DEBUG //в этом случае контекстное меню будет доступно только в отладочной сборке page()->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true); #endif
    Тогда во время выполнения в контекстном меню (щелчок правой кнопки мыши по QWebView) будет доступно пункт контекстного меню «Проверить» (Inspect).

    Выбрав который отображается окно Web-inspector-a.

    В данном окне на вкладке Scripts можно включить отладку.

    Установка breakpoint-а осуществляется кликом по соответствующему номеру строки слева.
    P.S. В Qt 4.8.6 мне так и не получилось перехватить breakpoint. В 5.3.0 все работает штатно.

    Недостатки

    У любого решения есть как свои достоинства, так и недостатки. И в данном случае за «красивости» D3.js придется платить свою цену.
    • Дополнительные накладные расходы (в первую очередь памяти).
      Помимо того, что QWebView «тянет» за собой webkit, создавая новый «гибридный» виджет мы заново создаем достаточно тяжеловесный объект QWebView. Это не так актуально, если весь UI грузится в одном QWebView (как предлагается в оригинальной идее гибридных приложений).
    • Риск невозможности обратного повторного использования в web после модификации JS. Под нужды Qt можно так модифицировать JavaScript код, что он станет непригоден в web-приложении. Поэтому все обращения к Qt-объекту api желательно изолировать в одном месте - например в секции script html файла, который в данном случае будет разный для web и Qt приложения а JS код в подключаемых файлах будет единым.
    • Баги WebKit-а в Qt 4.8.6
      В D3 активно используются древовидные структуры, описание которых находится в JSON файлах. На стороне Qt формируется такой же JSON объект посредством комбинации QVariantMap/QVariantList приведенных в итоге к QVariant. Несмотря на то, что структура, таких объектов идентична, в Qt 4.8.6 все же есть отличия, так как напрямую такой объект не воспринимается и приходится повторно «пересоздать» JSON объект в памяти на стороне JS. В Qt 5.3.0 такой костыль можно не использовать - все работает напрямую.

      Function recreateJsonObject(obj) { var jsonObj = {}; for(key in obj) { jsonObj = obj; var dependencies = ; for (var i = 0 ; i < obj.length ; i++) { dependencies.push(obj[i]); } jsonObj = dependencies; } return jsonObj; }

      Еще в Qt 4.8.6 после 15-20 секундного ресайза виджета приложение перестает штатно работать и вываливается ворох сообщений о ошибке в JS. В Qt 5.3.0 все работает штатно, что опять же наводит на мысль о том, что проблема кроется в реализации самого WebKit-а (хотя я могу заблуждаться). Однако вопросы выделения и освобождения памяти на стороне JS остаются актуальными.



    © 2024 beasthackerz.ru - Браузеры. Аудио. Жесткий диск. Программы. Локальная сеть. Windows