Как работает кроссплатформенность? В частности, Qt

 
0
 
C++
ava
КунгФуЧайник | 16.02.2013, 15:04
Есть взаимодействие с ОС: графическими компонентами, базами данных, сенсорами и прочими датчиками устройства и т.д. Краем уха слышал, что для разработки под андроид нужно еще скачать их NDK. Предположил, что все эти компоненты Qt (кнопки, списки, коннекторы и проч.) - обертки над существующими в целевых ОС соответствующими компонентами. Тогда получается:
1. Чтобы разрабатывать под какую-либо ОС необходимо скачать ее NDK, где описан код всех этих компонентов (различные гуи, доступ к базам, датчикам, сенсорам). При компиляции Qt заменяет код обращения к, например, Qtкнопке на "правильное" обращение из NDK.
2. Если в Qt нет компонента для работы с какой-либо возможностью, которая существует в целевом NDK (например, мультитач, гпс и т.п.), то реализовать в своей программе такую возможность я не смогу.  
Ответы (13)
ava
borisbn | 16.02.2013, 14:41 #
До Qt5 код компонентов Qt (например, QPushButton) выглядел (с бооооольшой натяжкой) примерно след. образом:

#ifdef WINDOWS
    #include <windows.h>
#else
#ifdef MACOS
    #include <cocoa.h> // Я MacOS не знаю, просто предположил, что там cocoa.h самый главный h-ник
#else
#ifdef LINUX
    #include <gnom.h> // см. про MacOS
#endif // #ifdef LINUX
#endif // #ifdef MACOS
#endif // #ifdef WINDOWS

QPushButton::QPushButton() {
    Q_HANDLE buttonHandle =
#ifdef WINDOWS
        CreateButton( ... );
#else
#ifdef MACOS
        NSCreateButton( ... );
#else
#ifdef LINUX
        xserverCreateButton( ... );
#endif // #ifdef LINUX
#endif // #ifdef MACOS
#endif // #ifdef WINDOWS
}


и... естественно, чтобы компилятор видел эти самые windows.h и CreateButton нужно, чтобы он знал, где лежат эти h-ники и lib-файлы (читай, чтобы знал, где находится NDK)

Цитата (КунгФуЧайник @  16.2.2013,  14:04 findReferencedText)
2. Если в Qt нет компонента для работы с какой-либо возможностью, которая существует в целевом NDK (например, мультитач, гпс и т.п.), то реализовать в своей программе такую возможность я не смогу. 

Qt - это просто набор библиотек для Си++ (впрочем, не только). Такой же набор библиотек, как, например, STL или boost (первый, правда, идёт с компилятором, а второй нужно ставить, но это - не важно). Так что если какой-то фичи нет в Qt, но есть в NDK, то ты можешь совершенно спокойно использовать где можешь компоненты Qt, а где нет - вызывать функции NDK (главное, чтобы твой компилятор знал о нём). Единственный минус - ты теряешь при этом кроссплатформенность, т.е. если взять твою программу, написанную на Windows и попробовать перекомпилировать на linux, то повалят ошибки. Однако, ничто не мешает тебе сделать точно таким же образом, как сделали разработчики Qt...
ava
Amp | 16.02.2013, 14:44 #
Цитата (КунгФуЧайник @  16.2.2013,  14:04 findReferencedText)
Qt (кнопки, списки, коннекторы и проч.) - обертки над существующими в целевых ОС соответствующими компонентами. 

Нет. Qt сам рисует контролы в соответствии с заданным стилем. Просто, обращаясь к некоторым системным или библиотечным (в случае с GTKStyle) функциям, их можно рисовать в точности как родные на заданной платформе. Обертки - это в wxWidgets (и то не везде).
ava
КунгФуЧайник | 16.02.2013, 15:17 #
Цитата (borisbn @  16.2.2013,  14:41 findReferencedText)
нет в Qt, но есть в NDK, то ты можешь совершенно спокойно использовать где можешь компоненты Qt, а где нет - вызывать функции NDK
 и
Цитата (Amp @  16.2.2013,  14:44 findReferencedText)
Нет. Qt сам рисует контролы в соответствии с заданным стилем. 

Я думал, что "кроссплатформенный" -- это просто унифицированный способ взаимодействия с компонентами различных ОС. Косметика. А вот при компиляции сгенерируется нативный код за место такой унификации, как в примере borisbn. И, получается, механизм отрисовки включается нативного кода, а не Qt. То есть вызов к QButton будет заменен на вызов к "windowsButton", если такая целевая ОС выбрана. А где-нибудь внутри cpp этого компонента описана функция Draw(), которая и будет вызвана (предположение). Поэтому что из себя представляют "компоненты  Qt" -- не очень понимаю.

ava
Amp | 16.02.2013, 15:29 #
В Linux отсутствует стандартный API для создания графического интерфейса, как в Windows. То есть эта ОС вообще никак не определяет как выглядят виджеты вроде кнопок, списков, меню. Все работает, как описал borisbn, только в случае с UI все просиходит на уровень ниже. Дергаются нативные функции для создания окна и отрисовки.
ava
КунгФуЧайник | 16.02.2013, 16:42 #
Цитата (Amp @  16.2.2013,  15:29 findReferencedText)
Все работает, как описал borisbn, только в случае с UI все просиходит на уровень ниже. Дергаются нативные функции для создания окна и отрисовки. 

В линуксе нет функций отрисовки гуи-элемнтов - в каждой билиотеке отрисовка реализована по-своему, либо программист пишет свою реализацию, если не пользуется чужими? О_О Что тогда "уровень ниже" и "нативные функции" -- OpenGL?
ava
Amp | 16.02.2013, 17:16 #
Цитата (КунгФуЧайник @  16.2.2013,  16:42 findReferencedText)
В линуксе нет функций отрисовки гуи-элемнтов - в каждой билиотеке отрисовка реализована по-своему, либо программист пишет свою реализацию, если не пользуется чужими? О_О Что тогда "уровень ниже" и "нативные функции" -- OpenGL? 

Да, в каждой по-своему. Именно поэтому существует стиль QGtkStyle для Qt и темы вроде Oxygen - чтобы заставить основную массу приложений выглядеть более-менее одинаково. Уровень ниже - это XLib (или XCB в случае Qt5). Можно и на OpenGL, хотя в этом случае все равно придется прибегнуть к XLib - чтобы создать окно и организовать обработку ввода как минимум.
ava
КунгФуЧайник | 16.02.2013, 17:51 #
Amp, теперь понятно: в случае с линукс Qt создает реализацию гуи-элементов сам.
Еще вопрос, на примере самсунга. На смартфонах-планшетах линейки note есть поддержка технологии вакома, а на других линейках - нет. Получается, что такая поддержка не на уровне ОС, а реализована в версии андроида под данное устройство. Тогда, чтобы получить доступ к вакомовскому апи, кроме NDK андроида, нужно еще качать и NDK вакома? То есть Qt + NDK целевой ОС + NDK для "фишки", уникальной только для какого-либо устройства. 
ava
Amp | 16.02.2013, 17:54 #
Цитата (КунгФуЧайник @  16.2.2013,  17:51 findReferencedText)
в случае с линукс Qt создает реализацию гуи-элементов сам. 

В Windows и Mac тоже. Только делает их по внешнему виду и по поведению максимально похожими на родные.
ava
bsa | 17.02.2013, 08:45 #
Цитата (КунгФуЧайник @  16.2.2013,  18:51 findReferencedText)
Тогда, чтобы получить доступ к вакомовскому апи, кроме NDK андроида, нужно еще качать и NDK вакома? То есть Qt + NDK целевой ОС + NDK для "фишки", уникальной только для какого-либо устройства.  
Нет. Для этого нужно найти общий для всех платформ АПИ или писать через #ifdef/#endif... Потому что, скорее всего, ваком не будет работать на андроиде.
ava
КунгФуЧайник | 17.02.2013, 11:24 #
NDK - это набор .h, .cpp, .lib и прочих файлов, дающих api к возможностям системы: к gui и прочему. Так? У линукса gui-апи не реализовано, реализация лежит на Qt - ладно. Но у win и macOS есть же свое api, которое Qt берет из NDK.

Цитата (bsa @  17.2.2013,  08:45 findReferencedText)
Потому что, скорее всего, ваком не будет работать на андроиде. 

В серии galaxy note самсунг использует технологию вакома. Но, вроде, только в этой серии. Получается, для нее есть отдельный NDK и если писать софт, который должен работать и на такой версии андроида, и на той, где поддержки вакома нет, то пользоваться как раз "#ifdef/#endif..."?
ava
math64 | 17.02.2013, 13:05 #
Зачастую #ifdef не пользуются, а создают файлы myclass.h, myclass.cpp, myclass_p.h, myclass_win.cpp, myclass_mac.cpp, myclass_linux.cpp и т.д. и в проект включают версию файла для нужной платформы.
А хочешь портабельность для android - пиши на java.
ava
_GRIN_ | 18.02.2013, 18:53 #
Qt для Android - это Necessitas - с недавнего времени включён Digia в свой сдк, в плане поддержки Qt на Android.
Я писал на нём ещё до этого "включения" - на 4.8 - всё нормально, неприятно только, что на устройстве потребуется ещё Ministro поставить (тоже от производителя Necessitas) - который на устройство необходимые сборки Qt библиотек затянет.
ava
bsa | 18.02.2013, 22:51 #
Цитата (math64 @  17.2.2013,  14:05 findReferencedText)
Зачастую #ifdef не пользуются, а создают файлы myclass.h, myclass.cpp, myclass_p.h, myclass_win.cpp, myclass_mac.cpp, myclass_linux.cpp и т.д. и в проект включают версию файла для нужной платформы.
Ха. И тем и другим пользуются в полную силу. Посмотри QSerialPort.
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить