Россия, Новосибирск |
Разработка приложений для планшетных компьютеров
9.8. Программирование сенсорного экрана
От ноутбуков планшеты отличает отсутствие традиционной клавиатуры, от смартфонов - большие размеры. Они ориентированы в первую очередь на развлечение пользователя, пассивное восприятие информации. В линейке аппаратных платформ на Intel Atom планшеты занимают одно из главных мест.
В этом разделе мы рассмотрим аппаратные такую особенность планшетов, как сенсорный экран, который в планшете заменяет почти все традиционные устройства ввода, такие как "мышь" и клавиатура. В случае "мыши" эти замена почти эквивалента по природе самого сенсорного экрана - оба они являются pointing device, и мы сосредоточимся как раз на этом случае. Для программирования будем использовать технологию Qt.
Qt - это инструментарий, включающий в себя программный фреймворк, библиотеку элементов графического интерфейса и набор программ для разработки, - который используется для разработки межплатформенных приложений с графическим пользовательским интерфейсом преимущественно на языке С++. Однако, в различное время были созданы интерфейсы, позволяющие вести разработку с использованием Qt и на других языках программирования, таких как: Python - PyQt, PySide; Ruby - QtRuby; Java - QtJambi; PHP - PHP-Qt и другие.
Инструментарий Qt лежит в основе популярной среди пользователей Unix-подобных систем среды рабочего стола KDE, а также таких приложений, как Skype, VLC, Virtual Box и многих других.
Использование API Qt вместо других, специфичных для платформы, программных интерфейсов, позволяет создавать приложения, которые, во многих случаях, без всяческих доработок будет компилироваться и исполняться на любой из ОС поддерживаемых Qt, а в большинстве других случаев требовать лишь незначительной доработки. Среди таких ОС, помимо MeeGo - Windows, Mac OS X, различные дистрибутивы Linux, Solaris, использующие оконную систему X11, Symbian, Windows CE.
9.8.1. Краткие сведения о Qt
Разработка Qt как графического toolkit (библиотеки графических компонентов) была начата в 1991 году Гаавардом Нордом и Айриком Шамбе-Ингом, основавшими впоследствии компанию Quasar Technologies, затем переименованную в Trolltech. Идея разработки кроссплатфоменного toolkit появилась во время работы над графическим приложением для медицинской индустрии, которое должно было работать в ОС Windows и Unix. Буква Q появилась в названии фреймворка, поскольку Гааварду очень нравилось её начертание в шрифте, использовавшемся в редакторе Emacs. Буква t, за которой скрывается слово "toolkit", была добавлена по аналогии с Xt - X Toolkit, библиотекой для создания виджетов в оконной системе X.
Несколько лет проект разрабатывался без представления на рынке. Первый релиз Qt был сделан в 1995 году. Он включил в себя набор графических компонент для Х11/Unix и Windows. В версии 3.0, вышедшей в 2001 году, появилась также поддержка Mac OS X.
В различное время фреймворк Qt распространялся под разными лицензиями. Если версия Qt для оконной системы X11 изначально выпускалась как под коммерческой, так и под бесплатной (хотя и не свободной) лицензией с открытым исходным кодом, то первые версии для Windows и Mac OS X существовали лишь в версии для коммерческого использования. Особую остроту вопрос лицензирования технологии приобрел с ростом популярности оконной среды KDE среди пользователей Linux в конце 90-ых годов, когда стало очевидно, что одна из важнейших компонент наиболее популярной свободной ОС не является свободным ПО. Проблема лицензирования X11-версии была решена при помощи перехода на свободную лицензию QPL и основания KDE Free Qt Foundation - организации, гарантирующей, что в случае, если разработка свободной версии Qt будет приостановлено, последняя версия будет выпущена под лицензией типа BSD.
Хотя к 2003 году версии Qt для OS X и для X11 выпускались под свободными лицензиями, версия для Windows по-прежнему выпускалась лишь под коммерческой лицензией. Это привело к тому, что в 2002 группа независимых разработчиков начала работу по портированию X11-версии фреймворка, выпущенной под лицензией GPL, на Windows. Работа эта, впрочем, не была завершена, поскольку в 2005 была выпущена версия фреймворка 4.0, в действие лицензии GPL было распространено на версии для всех поддерживаемых платформ. Добавленное позднее специальное исключение в лицензию, сделало возможным использование GPL-версии Qt в проектах, использующих одну из целого ряда свободных лицензий, таких, как BSD License, Eclipse Public License и других.
В 2008 году компания Trolltech была приобретена компанией Nokia и переименована сперва в Qt Software, а впоследствии - в Qt Development Frameworks. Вскоре после этого была выпущена версия фреймворка для основной мобильной ОС, использующейся Nokia - Symbian S60. С развитием другой мобильной ОС, разрабатываемой Nokia - Maemo, в Qt была добавлена поддержка и этой платформы.
В версии Qt 4.5, вышедшей 14 января 2009 г., в фреймворк была добавлена третья опция лицензирования - LGPL, что сделало возможным использование "бесплатной" версии Qt в проектах с закрытым кодом (при выполнении некоторых условий).
Основным преимуществом программирования с Qt является в упрощении и унификации процесса разработки программного обеспечения для различных целевых платформ. Сложности, возникающие, при портировании проектов с одной платформы на другую, очевидны. В силу различия архитектур ОС и отсутствия общепринятых стандартов и интерфейсов, код приложения оказывается насквозь пронизанным обращениями к специфичными для платформы API. Это становится особенно заметным в участках кода, отвечающих за графический пользовательский интерфейс, однако зачастую даже безобидные с виду участки, использующие стандартизированные API, оказываются труднопортируемыми.
Qt в значительной степени облегчает решение этой проблемы, предоставляя широчайший набор унифицированных программных интерфейсов. Вместо API операционной системы разработчик использует API Qt. API Qt реализован для каждой конкретной целевой архитектуры и опирается на нативные API операционной системы. В силу этого, приложение, написанное с использованием API Qt, фактически использует высокую производительность нативных интерфейсов целевой платформы; часто библиотеки Qt являются лишь тонкой прослойкой между приложением и API ОС.
Ещё одно несомненное преимущество Qt состоит в том, что его API позволяет скрыть сложные интерфейсы внешних библиотек. Порой для выполнения некоторой достаточно простой операции с использованием API ОС, программисту приходится изучать объёмную документацию и реализовывать тяжеловесные функции, инициализирующие и деинициализирующие применяемую библиотеку и т. д. Наглядным примером этой проблемы является создание оконных приложений с использованием Windows API.
Другой аспект использования Qt заключается в унификации кода приложения. Крупный проект зачастую использует значительное число внешних библиотек, многие из которых используют весьма специфичные по стилю интерфейсы, что порождает разнородные участки кода. API Qt используют единый стиль и подход, что позволяет сделать ваш код более легко читаемым и ясным.
Итак, Qt позволяет запускать написанное с его помощью ПО в большинстве современных операционных систем путём простой компиляции программы для каждой ОС без изменения исходного кода. Он включает в себя основные классы, которые могут потребоваться при разработке прикладного программного обеспечения, начиная от элементов графического интерфейса и заканчивая классами для работы с сетью, базами данных и XML.
Кратко опишем ключевые библиотеки, входящие в дистрибутив:
- QtCore - базовые примитивы, не имеющие отношения к GUI;
- QtGui - примитивы GUI Phonon и QtMultimedia - библиотеки для работы с мультимедиа;
- QtNetwork - работа с сетью;
- QtOpenGL - поддержка OpenGL-графики;
- QtXml - работа с XML;
- QtSql - работа с SQL-базами данных;
- QtScript - позволяет использовать скриптовый язык, аналогичный JavaScript в Qt-приложениях;
- QtWebKit - позволяет работать с веб-движком (библиоткой для обработки и отображения Web-страниц) WebKit.
Для разработки кросс-платформенных приложений для мобильных устройств компания Qt Software разработала дополниельную библиотеку Qt Mobility, пока не входящую в состав основного дистрибутива. Qt Mobility должен обеспечить удобную разработку приложений для мобильных платформ, поддерживающих Qt и, в первую очередь, ОС MeeGo.
Qt Mobility предоставляет интерфейс для функциональностей, специфичных для мобильных устройств, таких как, например:
- сервисы (GSM-связь, Bluetooth) ;
- записная книжка;
- мгновенные сообщения;
- органайзер;
- устройства позиционирования;
- сенсоры (акселерометр, датчик освещённости).
В пакете Qt SDK поставляется набор инструментов, которые облегчают разработку приложений с использованием фреймворка. Перечислим основные:
- QtCreator - кроссплатформенная IDE для работы с фреймворком Qt, разработанная Qt Software. Эта IDE была специально разработана для работы с Qt, имеет возможности удаленной отладки, расширения плагинами, встроенный QtDesigner и QtAssistant и графический фронтенд для gdb. QtCreator входит в состав SDK.
- QtDesigner - инструмент для визуального дизайна графических интерфейсов. В результате работы Qt Designer создается xml файл, описывающий графический интерфейс.
- QtLinguist - локализация интерфейса.
- QtAssistant - система справки.
- QtSimulator - эмулятор мобильных устройств.
- qmake - система сборки.
- moc - метаобъектный компилятор , предварительная система обработки исходного кода. Позволяет использовать механизм слотов и сигналов. Утилита moc ищет в заголовочных файлах на C++ описания классов, содержащие макрос Q_OBJECT, и создаёт дополнительный исходный файл на C++, содержащий реализацию дополнительных методов.
- uic - компилятор графических интерфейсов, который получает на вход xml файл, сгенерированный QtDesigner, и по нему выдает код на С++.
- rcc - компилятор ресурсов.
qmake - программное средство, с помощью которого упрощается процесс сборки проекта при разработке для разных платформ. qmake автоматизирует создание файла сборки Makefile, используя для этого более простой и лаконичный файл *.pro.
Утилита создает Makefile, основываясь на информации в файле проекта. Файлы проекта обычно создаются разработчиком, однако для их первичного создания можно также использовать и саму утитлиту qmake, запуская её с аргументом -project. qmake содержит дополнительные возможности для поддержки разработки с Qt, включая автоматическое создание правил для moc и uic.
Рассмотрим простой пример работы с qmake. Допустим, что у вас уже завершена начальная реализация вашего приложения, и у вас имеются следующие файлы: hello.cpp, hello.h, main.cpp. Используя текстовый редактор, создайте файл с названием hello.pro. Теперь в этот файл следует добавить строки, которые сообщают qmake об исходных файлах, файлах-заголовках, используемых библиотеках, которые следует прилинковать в процессе сборки и др.
На первом шаге добавим исходные файлы в файл проекта. Чтобы это сделать, нужно использовать переменную SOURCES. Надо написать новую строку с SOURCES += и добавить hello.cpp после нее. Должно получиться наподобие:
SOURCES += hello.cpp
Теперь нужно повторить эти действия для каждого исходного файла в проекте. В итоге в нашем примере получается следующее:
SOURCES += hello.cpp SOURCES += main.cpp
Или в одну строку:
SOURCES = hello.cpp \ main.cpp
Кроме исходных файлов должны быть указаны файлы заголовка. Для их добавления используется переменная HEADERS.
После изменений наш файл выглядит так:
HEADERS += hello.h SOURCES += hello.cpp \ main.cpp
Имя файла результата сборки устанавливается автоматически; оно такое же, как и имя файла проекта, но с суффиксом, соответствующим платформе. Например, если файл проекта называется - hello.pro, результатом сборки будет файл hello.exe для Windows и hello для Unix. Другое имя файла для результата сборки может быть указано в переменной target. Например,
TARGET = helloworld
Далее установим переменную CONFIG, отвечающую за общую конфигурацию сборки. Так как наш приложение использует Qt, то нужно поместить qt в строке CONFIG для того, чтобы qmake добавил релевантные библиотеки и обеспечил встроенные строки для moc и uic, включаемые в создаваемый файл сборки. Если в переменной CONFIG указать значение debug, то будет создана отладочная версия программы.
Переменная QT позволяет указать, какие модули Qt использует. Для тестового файла укажем, что мы хотим использовать библиотеки ядра (core), XML (xml) и библиотеки работы с сетью (net). В результате в файл будет записана следующая строка:
QT += core xml network
Переменная LIBS перечисляет внешние библиотеки, которые мы хотим прилинковать к приложению, в виде ключей для линковщика. В примере прилинкуем к приложению библиотеку ncurses:
LIBS += -lncurses
Зачастую возникает необходимость собирать приложение в разных вариантах, например, для разных целевых платформ. В qmake для поддержки различных видов сборки существует механизм scopes, который позволяет создавать условные блоки и в зависимости от выполнения условий переходить в те или иные состояния. Добавим небольшой пример и в наш файл. Введем условные блоки, которые в зависимости от целевой платформы будут добавлять исходные файлы в проект. Так, например для windows будет добавлен файл hellowin.cpp :
win32 { SOURCES += hellowin.cpp }
А для unix hellounix.cpp:
unix { SOURCES += hellounix.cpp }
Также при помощи простой функции exists проверим, существует ли файл main.cpp:
!exists( main.cpp ) { error( "No main.cpp file found" ) }
Запишем полностью получившийся qmake файл:
CONFIG += qt QT += core xml network HEADERS += hello.h SOURCES += hello.cpp SOURCES += main.cpp LIBS += -lncurses win32 { SOURCES += hellowin.cpp } unix { SOURCES += hellounix.cpp } !exists( main.cpp ) { error( "No main.cpp file found" ) }
Теперь qmake можно использовать для создания файла сборки приложения. В командной строке в каталоге с проектом нужно написать:
qmake hello.pro
Затем может быть запущена утилита make или nmake для сборки проекта.
Сигналы и слоты используются для обмена сообщениями между объектами. Механизм сигналов и слотов является особенностью Qt. Необходимость в подобном механизме возникает, когда требуется, чтобы при изменении одного объекта, оповещался другой. Так, например, при разработке графического интерфейса, при нажатии на кнопку "Закрыть" вызывается метод окна close().
Техника сигналов и слотов реализована следующим образом: сигнал вырабатывается, когда происходит определенное событие, а слот - это функция, которая вызывается в ответ на определенный сигнал. Каждый класс может объявлять сигналы, которые он будет отправлять и слоты, которые можно ассоциировать с конкретными сигналами. При этом сигналы и слоты слабо связаны. Класс, который вырабатывает сигнал, не знает и не заботится о том, какие слоты его получат.
Сигналы и слоты могут иметь аргументы. Механизм сигналов и слотов Qt гарантирует, что если мы подключим сигнал к слоту, слот будет вызван с параметрами сигнала в нужное время.
Система слотов и сигналов реализована как надстройка над синтаксисом С++. Исходный файл обрабатывается метакомпилятором moc, который генерирует вспомогательные файлы. При этом ограничения метакомпилятора накладывают определенные ограничения на классы, использующие слоты и сигналы для взаимодействия. Так, например, такие классы не могут использовать механизм шаблонов C++.