| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Как работает кроссплатформенность? В частности, Qt |
| Автор: КунгФуЧайник 16.2.2013, 14:04 |
| Есть взаимодействие с ОС: графическими компонентами, базами данных, сенсорами и прочими датчиками устройства и т.д. Краем уха слышал, что для разработки под андроид нужно еще скачать их NDK. Предположил, что все эти компоненты Qt (кнопки, списки, коннекторы и проч.) - обертки над существующими в целевых ОС соответствующими компонентами. Тогда получается: 1. Чтобы разрабатывать под какую-либо ОС необходимо скачать ее NDK, где описан код всех этих компонентов (различные гуи, доступ к базам, датчикам, сенсорам). При компиляции Qt заменяет код обращения к, например, Qtкнопке на "правильное" обращение из NDK. 2. Если в Qt нет компонента для работы с какой-либо возможностью, которая существует в целевом NDK (например, мультитач, гпс и т.п.), то реализовать в своей программе такую возможность я не смогу. |
| Автор: Amp 16.2.2013, 14:44 | ||
Нет. Qt сам рисует контролы в соответствии с заданным стилем. Просто, обращаясь к некоторым системным или библиотечным (в случае с GTKStyle) функциям, их можно рисовать в точности как родные на заданной платформе. Обертки - это в wxWidgets (и то не везде). |
| Автор: КунгФуЧайник 16.2.2013, 15:17 | ||
Я думал, что "кроссплатформенный" -- это просто унифицированный способ взаимодействия с компонентами различных ОС. Косметика. А вот при компиляции сгенерируется нативный код за место такой унификации, как в примере borisbn. И, получается, механизм отрисовки включается нативного кода, а не Qt. То есть вызов к QButton будет заменен на вызов к "windowsButton", если такая целевая ОС выбрана. А где-нибудь внутри cpp этого компонента описана функция Draw(), которая и будет вызвана (предположение). Поэтому что из себя представляют "компоненты Qt" -- не очень понимаю. |
| Автор: Amp 16.2.2013, 15:29 |
| В Linux отсутствует стандартный API для создания графического интерфейса, как в Windows. То есть эта ОС вообще никак не определяет как выглядят виджеты вроде кнопок, списков, меню. Все работает, как описал borisbn, только в случае с UI все просиходит на уровень ниже. Дергаются нативные функции для создания окна и отрисовки. |
| Автор: КунгФуЧайник 16.2.2013, 16:42 | ||
В линуксе нет функций отрисовки гуи-элемнтов - в каждой билиотеке отрисовка реализована по-своему, либо программист пишет свою реализацию, если не пользуется чужими? О_О Что тогда "уровень ниже" и "нативные функции" -- OpenGL? |
| Автор: Amp 16.2.2013, 17:16 | ||
Да, в каждой по-своему. Именно поэтому существует стиль QGtkStyle для Qt и темы вроде Oxygen - чтобы заставить основную массу приложений выглядеть более-менее одинаково. Уровень ниже - это XLib (или XCB в случае Qt5). Можно и на OpenGL, хотя в этом случае все равно придется прибегнуть к XLib - чтобы создать окно и организовать обработку ввода как минимум. |
| Автор: КунгФуЧайник 16.2.2013, 17:51 |
| Amp, теперь понятно: в случае с линукс Qt создает реализацию гуи-элементов сам. Еще вопрос, на примере самсунга. На смартфонах-планшетах линейки note есть поддержка технологии вакома, а на других линейках - нет. Получается, что такая поддержка не на уровне ОС, а реализована в версии андроида под данное устройство. Тогда, чтобы получить доступ к вакомовскому апи, кроме NDK андроида, нужно еще качать и NDK вакома? То есть Qt + NDK целевой ОС + NDK для "фишки", уникальной только для какого-либо устройства. |
| Автор: Amp 16.2.2013, 17:54 |
В Windows и Mac тоже. Только делает их по внешнему виду и по поведению максимально похожими на родные. |
| Автор: bsa 17.2.2013, 08:45 |
| Нет. Для этого нужно найти общий для всех платформ АПИ или писать через #ifdef/#endif... Потому что, скорее всего, ваком не будет работать на андроиде. |
| Автор: КунгФуЧайник 17.2.2013, 11:24 |
| NDK - это набор .h, .cpp, .lib и прочих файлов, дающих api к возможностям системы: к gui и прочему. Так? У линукса gui-апи не реализовано, реализация лежит на Qt - ладно. Но у win и macOS есть же свое api, которое Qt берет из NDK. В серии galaxy note самсунг использует технологию вакома. Но, вроде, только в этой серии. Получается, для нее есть отдельный NDK и если писать софт, который должен работать и на такой версии андроида, и на той, где поддержки вакома нет, то пользоваться как раз "#ifdef/#endif..."? |
| Автор: math64 17.2.2013, 13:05 |
| Зачастую #ifdef не пользуются, а создают файлы myclass.h, myclass.cpp, myclass_p.h, myclass_win.cpp, myclass_mac.cpp, myclass_linux.cpp и т.д. и в проект включают версию файла для нужной платформы. А хочешь портабельность для android - пиши на java. |
| Автор: _GRIN_ 18.2.2013, 18:53 |
| Qt для Android - это Necessitas - с недавнего времени включён Digia в свой сдк, в плане поддержки Qt на Android. Я писал на нём ещё до этого "включения" - на 4.8 - всё нормально, неприятно только, что на устройстве потребуется ещё Ministro поставить (тоже от производителя Necessitas) - который на устройство необходимые сборки Qt библиотек затянет. |
| Автор: bsa 18.2.2013, 22:51 |
| Ха. И тем и другим пользуются в полную силу. Посмотри QSerialPort. |