Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как работает кроссплатформенность? В частности, Qt 
:(
    Опции темы
КунгФуЧайник
Дата 16.2.2013, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 10.8.2011

Репутация: нет
Всего: нет



Есть взаимодействие с ОС: графическими компонентами, базами данных, сенсорами и прочими датчиками устройства и т.д. Краем уха слышал, что для разработки под андроид нужно еще скачать их NDK. Предположил, что все эти компоненты Qt (кнопки, списки, коннекторы и проч.) - обертки над существующими в целевых ОС соответствующими компонентами. Тогда получается:
1. Чтобы разрабатывать под какую-либо ОС необходимо скачать ее NDK, где описан код всех этих компонентов (различные гуи, доступ к базам, датчикам, сенсорам). При компиляции Qt заменяет код обращения к, например, Qtкнопке на "правильное" обращение из NDK. 
2. Если в Qt нет компонента для работы с какой-либо возможностью, которая существует в целевом NDK (например, мультитач, гпс и т.п.), то реализовать в своей программе такую возможность я не смогу.  

PM MAIL   Вверх
borisbn
Дата 16.2.2013, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



До 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 Найти цитируемый пост)
2. Если в Qt нет компонента для работы с какой-либо возможностью, которая существует в целевом NDK (например, мультитач, гпс и т.п.), то реализовать в своей программе такую возможность я не смогу. 

Qt - это просто набор библиотек для Си++ (впрочем, не только). Такой же набор библиотек, как, например, STL или boost (первый, правда, идёт с компилятором, а второй нужно ставить, но это - не важно). Так что если какой-то фичи нет в Qt, но есть в NDK, то ты можешь совершенно спокойно использовать где можешь компоненты Qt, а где нет - вызывать функции NDK (главное, чтобы твой компилятор знал о нём). Единственный минус - ты теряешь при этом кроссплатформенность, т.е. если взять твою программу, написанную на Windows и попробовать перекомпилировать на linux, то повалят ошибки. Однако, ничто не мешает тебе сделать точно таким же образом, как сделали разработчики Qt...

Это сообщение отредактировал(а) borisbn - 16.2.2013, 14:43


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Amp
Дата 16.2.2013, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



Цитата(КунгФуЧайник @  16.2.2013,  14:04 Найти цитируемый пост)
Qt (кнопки, списки, коннекторы и проч.) - обертки над существующими в целевых ОС соответствующими компонентами. 

Нет. Qt сам рисует контролы в соответствии с заданным стилем. Просто, обращаясь к некоторым системным или библиотечным (в случае с GTKStyle) функциям, их можно рисовать в точности как родные на заданной платформе. Обертки - это в wxWidgets (и то не везде).

Это сообщение отредактировал(а) Amp - 16.2.2013, 14:45
PM MAIL   Вверх
КунгФуЧайник
Дата 16.2.2013, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 10.8.2011

Репутация: нет
Всего: нет



Цитата(borisbn @  16.2.2013,  14:41 Найти цитируемый пост)
нет в Qt, но есть в NDK, то ты можешь совершенно спокойно использовать где можешь компоненты Qt, а где нет - вызывать функции NDK
 и
Цитата(Amp @  16.2.2013,  14:44 Найти цитируемый пост)
Нет. Qt сам рисует контролы в соответствии с заданным стилем. 

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



Это сообщение отредактировал(а) КунгФуЧайник - 16.2.2013, 15:19
PM MAIL   Вверх
Amp
Дата 16.2.2013, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



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


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 10.8.2011

Репутация: нет
Всего: нет



Цитата(Amp @  16.2.2013,  15:29 Найти цитируемый пост)
Все работает, как описал borisbn, только в случае с UI все просиходит на уровень ниже. Дергаются нативные функции для создания окна и отрисовки. 

В линуксе нет функций отрисовки гуи-элемнтов - в каждой билиотеке отрисовка реализована по-своему, либо программист пишет свою реализацию, если не пользуется чужими? О_О Что тогда "уровень ниже" и "нативные функции" -- OpenGL?
PM MAIL   Вверх
Amp
Дата 16.2.2013, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



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

Да, в каждой по-своему. Именно поэтому существует стиль QGtkStyle для Qt и темы вроде Oxygen - чтобы заставить основную массу приложений выглядеть более-менее одинаково. Уровень ниже - это XLib (или XCB в случае Qt5). Можно и на OpenGL, хотя в этом случае все равно придется прибегнуть к XLib - чтобы создать окно и организовать обработку ввода как минимум.
PM MAIL   Вверх
КунгФуЧайник
Дата 16.2.2013, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 10.8.2011

Репутация: нет
Всего: нет



Amp, теперь понятно: в случае с линукс Qt создает реализацию гуи-элементов сам. 
Еще вопрос, на примере самсунга. На смартфонах-планшетах линейки note есть поддержка технологии вакома, а на других линейках - нет. Получается, что такая поддержка не на уровне ОС, а реализована в версии андроида под данное устройство. Тогда, чтобы получить доступ к вакомовскому апи, кроме NDK андроида, нужно еще качать и NDK вакома? То есть Qt + NDK целевой ОС + NDK для "фишки", уникальной только для какого-либо устройства. 
PM MAIL   Вверх
Amp
Дата 16.2.2013, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



Цитата(КунгФуЧайник @  16.2.2013,  17:51 Найти цитируемый пост)
в случае с линукс Qt создает реализацию гуи-элементов сам. 

В Windows и Mac тоже. Только делает их по внешнему виду и по поведению максимально похожими на родные.
PM MAIL   Вверх
bsa
Дата 17.2.2013, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Цитата(КунгФуЧайник @  16.2.2013,  18:51 Найти цитируемый пост)
Тогда, чтобы получить доступ к вакомовскому апи, кроме NDK андроида, нужно еще качать и NDK вакома? То есть Qt + NDK целевой ОС + NDK для "фишки", уникальной только для какого-либо устройства.  
Нет. Для этого нужно найти общий для всех платформ АПИ или писать через #ifdef/#endif... Потому что, скорее всего, ваком не будет работать на андроиде.
PM   Вверх
КунгФуЧайник
Дата 17.2.2013, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 10.8.2011

Репутация: нет
Всего: нет



NDK - это набор .h, .cpp, .lib и прочих файлов, дающих api к возможностям системы: к gui и прочему. Так? У линукса gui-апи не реализовано, реализация лежит на Qt - ладно. Но у win и macOS есть же свое api, которое Qt берет из NDK. 

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

В серии galaxy note самсунг использует технологию вакома. Но, вроде, только в этой серии. Получается, для нее есть отдельный NDK и если писать софт, который должен работать и на такой версии андроида, и на той, где поддержки вакома нет, то пользоваться как раз "#ifdef/#endif..."?

PM MAIL   Вверх
math64
Дата 17.2.2013, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Зачастую #ifdef не пользуются, а создают файлы myclass.h, myclass.cpp, myclass_p.h, myclass_win.cpp, myclass_mac.cpp, myclass_linux.cpp и т.д. и в проект включают версию файла для нужной платформы.
А хочешь портабельность для android - пиши на java.
PM   Вверх
_GRIN_
Дата 18.2.2013, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 6
Всего: 7



Qt для Android - это Necessitas - с недавнего времени включён Digia в свой сдк, в плане поддержки Qt на Android.
Я писал на нём ещё до этого "включения" - на 4.8 - всё нормально, неприятно только, что на устройстве потребуется ещё Ministro поставить (тоже от производителя Necessitas) - который на устройство необходимые сборки Qt библиотек затянет.

Это сообщение отредактировал(а) _GRIN_ - 18.2.2013, 18:54


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
bsa
Дата 18.2.2013, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Цитата(math64 @  17.2.2013,  14:05 Найти цитируемый пост)
Зачастую #ifdef не пользуются, а создают файлы myclass.h, myclass.cpp, myclass_p.h, myclass_win.cpp, myclass_mac.cpp, myclass_linux.cpp и т.д. и в проект включают версию файла для нужной платформы.
Ха. И тем и другим пользуются в полную силу. Посмотри QSerialPort.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0893 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.