данная информация позаимствована с сайта http://developer.symbian.org/wiki/index … _iPhone_OS
Портирование с iPhone OS
Изображения любезно предоставлены Apple и вежливость Nokia
Эта статья предназначена для разработчиков, которые заинтересованы в портировании родной iPhone и IPod Touch приложений для Symbian устройств платформы. Она предполагает, что вы уже знакомы с разработкой приложения для iPhone OS. Мы не ставим из научить вас о iPhone развития здесь, а ограничимся описанием основ Symbian, и где можно узнать больше, чтобы помочь вам получить порт начал. Мы также описываем сопоставление основных iPhone OS идиомы программирования и интерфейсов API для своих коллег о Symbian платформы.
Содержание [спрятать]
1 Переход от iPhone OS для платформы Symbian
1,1 Архитектура
1,2 оборудования
1,3 Портирование Стратегии
2 какао Рамочной Фонда и Qt сравнению
2,1 базовых классов
2,2 для работы со строками
2,3 контейнеры
2,4 Основные I / O
2,5 Сеть
2,6 Threading Взгляд
3 Перенос Пользовательский интерфейс
3,1 GUI инструменты дизайна
3,2 Инициализация применению
3,3 интерфейса компоновочных блоков
3,4 Варианты View-Controller Design Pattern-модели
4 Мобильный конкретные интерфейсы
5 Резюме
6 Дополнительная информация
Переход от iPhone OS для платформы Symbian
Архитектура
Symbian архитектуры показывая PIPS модулей, чтобы показать, как родной Symbian C + + приложений, и те, портирована на платформу с использованием стандартного C / C + +, взаимодействовать с более низкого уровня операционной системы.
Symbian платформы написан на Symbian C + +, совместимости слоев, чтобы стандартный C и C + + поддержку. Родные приложения должны в настоящее время используется Symbian C + +, но Qt в настоящее время портирована на платформу Symbian, так и в будущем можно будет писать приложения, используя более стандартным C / C + + идиомы программирования.
двигатель "Портирование кода, который не использует прикладном уровне платформы Symbian, относительно проста. Во многих случаях это может быть возможным, чтобы избежать использования Symbian C + + идиом. Смотрите наш Портирование категории для дополнительных статей, в которых обсуждаются переноса C / C + + код Symbian.
Аппаратные средства
Целый ряд различных устройств может быть построен на Symbian, каждая с различной форм-факторов, функций и вычислительной мощности, например, аппаратное ускорение, размеры экрана, ввод возможностей и памяти. Платформа Symbian развивались в течение ряда лет, так что есть множество исторических разработки программного обеспечения комплектов, связанных с различными релизы устройства и платформы улучшений. Вы должны решить, что устройство или набор устройств, вам будет направлен с вашим кодом. Консультации и дополнительные ссылки можно найти здесь и целый ряд "рецепты" для обработки различия в устройстве форм-факторов и возможностей можно найти здесь.
Портирование Стратегии
Дизайн для портативности в письменном виде отдельного графического интерфейса и код двигателя, и использование чистого C / C + + в машинном коде. GUI необходимо будет переписать.
Простейшим родной сценарий переноса, когда вы портируете применения двигателя была написана в стандартном C или C + +. Это может быть следствием того, что приложение само по себе уже порту. Если это так, то вы можете рассмотреть возможность вернуться к первоначальному варианту вместо iPhone OS код.
Некоторые устройства Symbian отсутствие процессоре с плавающей запятой и аппаратной поддержкой Open GL ES. Если перенос игра, использующая OpenGL ES, возможно, потребуется специальное лечение, и вы сможете проверить, если ваша игра будет работать на необходимой скорости передачи на устройства ориентации.
Если вы переносе кода, написанного на Objective-C (с использованием Cocoa Touch), вам придется переписать с нуля для Symbian устройств. Наилучшим подходом является, вероятно, заменить Cocoa Touch код Qt код, так как Qt поддерживает Symbian устройств на базе S60 3rd Edition FP1 и выше.
Сходство между Qt и какао включают следующее:
рамках Фонда и QtCore / QtNetwork модуль классов
подсчет ссылок
Qt сигналов и слотов аналогичных действий Target-решения в какао
между потоками связи
Qt обеспечивает некоторый уровень самоанализа с его имуществом функцию.
Кроме того, перенос в Qt имеет явное преимущество, если вы планируете в порт вашего приложения на другие платформы, так как Qt является кросс-платформенной рамки, которые позволят сократить последовательные усилия порт. Однако, перенос на Qt-прежнему требует редизайна и может потребовать чистки до С + + навыки!
Qt базируется на C + +, но он добавляет объект компилятор мета (MOC), который расширяет объекты с информацией, которая доступна во время выполнения. Это можно сделать методом вызовов по названию (представлен в виде строки), вы вряд ли будут использовать часто, но это особенность Qt, которая напоминает Objective-C селекторов. Сигналы и слоты механизм позволяет подключить составе элементов формы разработчику код так же, как какао использует Target-действий парадигмы.
Какао Рамочной Фонда и Qt сравнению
Общего назначения, структуры данных и доступ к некоторым основным I / O охватываются рамках Фонда Cocoa Touch. В Qt эквиваленты в основном, но не исключительно, найденные в QtCore библиотеки. Ниже мы кратко рассмотрим в этих классах, чтобы увидеть, что можно сопоставить какао класса в Фонд. Она не претендует на исчерпывающее описание классов. Для получения дополнительной информации обращайтесь к ссылкой Qt doc.qtsoftware.com/4.5 на сайте QtSoftware.
Базовый класс
Эквивалент NSObject для Какао QObject для Qt. Этот класс является базовым классом всех классов в Qt. Она несет дополнительные метаданные, Qt использует для самоанализа и сигнал слот сообщений. Базовый класс также вспоминает поток, в котором он был создан (и сообщения доставляются к ней в этом потоке).
QObjects образуют иерархию, в которой родитель QObject например автоматически очищает ее детей. QObject инкапсулирует периодический таймер, обратный вызов QObject , который начал его через поток очереди сообщений в потоке.
Метаданных, созданных для экземпляров класса базы позволяет использовать тип идентификации Qt легкий в. Как C + + является статически типизированный язык, это не возможно отправлять сообщения на объекты, статические типы не сможет обрабатывать его (то есть, они не осуществляют надлежащий метод). Часто семантики код позволяет предположить, определенных динамического типа объекта. Qt предлагает qobject_cast <Введите *>(объект) оператора приведения безопасно делать отливки в этих случаях. Это возвращает NULL , если объект не имеет соответствующего динамического типа или возвращает объект приведен к указанному типу.
Для работы со строками
На месте NSString и NSMutableString который вы будете использовать в вашем iPhone OS код, вы должны использовать Qt в QString, который основан на QChar, 16-битный тип символов, используемая для хранения символов Unicode. Различия между QString и NSString / NSMutableString включают в себя:
Там, где QString методы принимают сопзЬ сЬаг *, они рассматриваются по умолчанию, как в стиле С строки символов ASCII (такое поведение может быть изменено по телефону QTextCodec:: setCodecForString () статический метод), в то время как какао вы должны указать кодировку.
QString использует неявный обмен с копией на запись (см. главу 6), с NSMutableString, разработчик может выбрать, исходя из ситуации на нерест ли копировать или просто увеличить количество ссылок.
QString лучше создан на стеке, как основного типа. Возвращаясь QString по значению тоже хорошо, как конструктор копирования только увеличивает количество ссылок на общих данных, к которым QString объект содержит указатель.
QString использует + + языка C функции перегрузки оператора и неявного преобразования. В результате, в итоге вы получите более простой и читаемый код, чем вы обычно получаете с какао.
Инициализация QString объект очень просто. Objective-C строки:
NSString* туЗЬптд =@ "Портирование легко";
превращается в следующий код Qt:
QString туЗЬптд="Перенос легко";
Здесь используется конструктор, который принимает сопзЬ сЬаг *. Она предполагает, что переданная строка ASCII. Кроме того, QChar массивы могут быть использованы для построения строки. Для типа по соображениям безопасности, массив копируется (используйте QString:: fromRawData () метод, чтобы избежать первоначального копирования тех пор, пока QString не нуждается в изменении).
Буквальное всегда может быть принят к функциям, где QString , как ожидается, так как конструктор делает QString в сопзЬ сЬаг *. В другом направлении, она может быть выполнена с помощью qPrintable макрос, который использует кодек наиболее подходящий для текущей локали.
Для сравнения строк, QString перекрывает == и! = операторов (несколько раз). Например, вы можете сделать что-то же естественно, как:
если (туЗЬптд == "Портирование трудно")(
//...
)
Версия какао будет выглядеть следующим образом:
если ( [туЗЬптд isEqualToString:@ "Портирование трудно"] )(
//...
)
> = И <= операторы также могут быть использованы, но с использованием QString:: сравнить () содержит более подробную информацию в один вызов функции.
Строками функции QString являются пояснительные в большинстве случаев. Функций, которые используются в какао будут предоставляться, например, для вставки, добавления (также в форме оператор + =), удаление и замену символов. Каждый из этих методов возвращает ссылку на объект изменил строку для удобства, так что операции могут быть цепь.
Некоторые дополнительные QString методы (всегда сопзЬ методы) возвращает новый QString объект, оставляя исходную строку без изменений. Некоторые представители этой категории QString:: левый (), QString:: вправо () и QString:: средний () методов, которые делают копию подстрока исходной строки.
NSString / NSMutableString сотрудничать красиво с NSData, что контейнер двоичных данных на Cocoa. То же самое справедливо и для аналоговых Qt от NSData / NSMutableData, называется QByteArray.
Возможно, для прохода по строке и работать на отдельных символов делает его вверх, используя QString:: в () метод или] Индекс [оператора, а также стиль итераторы STL. Это требует некоторого дополнительного ухода, как некоторые символы Unicode можно охарактеризовать только двумя 16-разрядный QChar данных. Следует отметить, что версия индекс оператора, которая возвращает QCharRef позволяет абоненту изменить символ в строку, как если бы это была и QChar.
Есть несколько классов, которые тесно связаны в строки и довольно широко используются. Например, QStringList список строк и наследуется от Список <QString> (см. следующий раздел контейнеры). Это более или менее эквивалентно использованию NSArray для хранения NSString объектов. Вызов QString:: сплит () даст вам нравится этот объект. Это функция, которая может пригодиться при разработке пользовательского интерфейса с дополнительные поля поиска, который позволяет фильтрации. Это может создать новый список существующих предметов, если соответствуют критерию дается. Фильтрация осуществляется с помощью 2 перекрывает из фильтра () методов.
Существует не имеют аналогов в NSScanner в Qt. Вместе с тем существует достаточно элегантный способ обработки строки итеративно. Вы можете сделать QTextStream основанные на строки, а затем использовать стандартный C + + поток операторов:
поплавок е;
Int я;
QString с;
QTextStream ввода("23 0,32 яблоко");
вход>>F>>я>>с;
В отличие от версии с какао NSScanner имеет следующий вид:
поплавок е;
NSInteger я;
NSString* ул;
NSScanner* сканер =
[NSScanner scannerWithString:@"23 0,32 яблоко"];
[сканера scanFloat:иF];
[сканера scanInt:ия];
[сканера scanCharactersFromSet:[NSCharacterSet alphanumericCharacterSet] intoString:иул];
Контейнеры
Qt предоставляет богатый контейнерных классов. Таблица 1 позволяет определить, какие из них использовать в конкретных случаях.
Таблица 1: Qt contatiners
Какао контейнерные QT класса Краткое описание
NSArray
NSMutableArray
QtList> Список терминов, которые используются contigunous памяти, быстрый доступ по индексу и быстро добавлять и добавьте операций
NSArray
NSMutableArray
QLinkedList <T> Как и в QList, с элементами доступны через итераторы и быстрее, вставки и удаления
NSArray
NSMutableArray
QVector <T> Динамический ввод в массив, для которого директиву несет наказание производительность по сравнению с QList, которые, как правило, лучший выбор
NSCountedSet Существует нет соответствующего класса - вы, наверное, написать его сами
NSDictionary
NSMutableDictionary
QMap <Key,T> Словарь пар ключ-значение, внутренне отсортировано по клавишам; один ключ может быть связан с несколькими значениями, однако QMultiMap имеет более удобный интерфейс
NSDictionary
NSMutableDictionary
QHash <Key, Т> Более быстрая версия QMap В каком порядке расположения ключей не поддерживается
NSSet
NSMutableSet
QSet <T> Набор реализации, в которых не множественность элементов сохраняется
Более подробную информацию о контейнерах Qt можно найти в справочной Qt См. doc.qtsoftware.com/4.5. примером перечисляя пункты в контейнерах какао заключается в следующем:
для (NSMutableString* ул списка)(
/ / Делаем что-то с ул
)
Для сравнения, Qt имеет тот же подход, стандартный C + + и предоставляет итератор классов: STL стиле сопзЬ и несопзЬ итераторы. Java-стиле итераторы также доступны однако они не так эффективны, как те, STL. Вот простой пример того, как вы могли бы умножить все элементы по 2 в списке целых использованием STL-стиль итератора:
QList<Int> список;
...
QList<Int>::итератор я;
для (я = списка.начаться(); я != списка.конце(); + +я)
/ / Делаем что-то с * я
Кроме того, для перечисления элементов в контейнере, Qt предоставляет Еогеасп:
QLinkedList<QString> список;
...
Еогеасп (QString, ул список)(
/ / Делаем что-то с ул
)
В Qt, алгоритмов, таких как быстрой сортировки и двоичного поиска также основаны на стиле STL-итераторов. Сравнение элементов зависит от главной из C + + операторы сравнения, а не на вспомогательные классы, такие как NSSortDescriptor в Cocoa.
Основные I / O
В какао рамках Фонд предоставляет небольшой набор классов, которые касаются основных ввода / вывода Эти классы NSFileHandle, NSStream, NSInputStream, NSOutputStream, NSFileManager, NSData и NSString. Последние два варианта могут быть просто инициализируется из содержимого файла. В этом случае содержимое файла полностью прочитать в этих объектов и дальнейшего манипуляций можно сделать эти объекты (например, разбиение строки на линии и учета их в клетки таблица). NSStream используется в основном для разъем основе коммуникации, нет никаких преимуществ в использовании его для ввода / вывода через NSFileHandle кроме выступающей в качестве абстрактного слоя то и тогда, когда основной канал может быть гнездо или на основе файлов. NSStream работает только три устройства: розетки, файлов и байт буфера, если дополнительные устройства нужны, они должны быть реализованы в удобном для пользователей, полученных подклассов.
Qt является поток ориентированы, его контейнерных классов можно управлять с потоком операторов. Например, следующий код добавляет 3, 5 и 7 к концу целого списка:
список<<3<<5<<7;
В Qt, за каждого потока всегда QIODevice объект, который представляет собой устройства, которые поддерживают чтение и запись блоков данных. QFile, QBuffer, QTcpSocket и QNetworkReply классы ярких примеров таких устройств. В какао, не существует такой базовый класс для устройств, вместо пути использования встроены в NSInputStream или NSOutputStream, который может быть открыт файл или буфер (NSData).
События на поток, доставляются в форме сообщения зарегистрированных делегата в Cocoa. В Qt это реализуется QIODevice излучающие сигнал, в котором Ваш код можно подключить разъем. Например, вы можете получить уведомление, если есть данные на поток TCP, подключив слот для QIODevice:: readyRead () сигнала.
QDataStream может быть открыт на этих устройств, обеспечивающих единый интерфейс для всех операций ввода / вывода в аппаратно-независимый путь. QDataStream реализует сериализации основных типов данных, а также других классов Qt с>> и <<операторов. Сериализация видел довольно много изменений, как Qt развивалась, сохранить соответствие между внешнее и внутреннее данных, важно указать, Qt версии при использовании более сложных типов с использованием QDataStream:: setVersion () метод. Вот небольшой пример:
Int оценка;
Int уровне;
...
QFile файл("gamestate.bin");
QDateTime DateTime = QDateTime::currentDateTime();
файл.открытым(QIODevice::WriteOnly);
QDataStream из(ифайл);
вне.setVersion(QDataStream::Qt_4_0);
из << DateTime.ToString();
из << уровне;
из << оценка;
...
Чтение из файла выполняется аналогично, только путем обращения вспять поток оператора.
Сеть
сетей классов Qt можно найти в QtNetwork модуль обеспечения низкого уровня и высокого уровня решения для обмена данными по сети.
Какао и сетей классов Qt схожи. В Qt, общего уровня сети доступа приложений, таких как HTTP, HTTPS и FTP заключена в QNetworkAccessManager класс, который можно считать Qt эквивалент NSUrlConnection. Если в NSUrlConnection обработчик событий указанный делегат QNetworkAccessManagerс событиями "может быть отреагировали на зарегистрированный в слоты.
QNetworkAccessManager работает на запрос объекта QNetworkRequest (сравните с NSUrlRequest) и ответить, завернутый в QNetworkReply объекта (сравните с NSUrlReply). QNetworkRequest это неявно общей класс, который содержит URL, заголовки запроса и соответствующие атрибуты.
События поступают через сигналы менеджер доступа к сети объекта:
authenticationRequired ()
proxyAuthenticationRequired ()
sslErrors ()
готовые ().
Аутентификация связанных сигналов, как ожидается, при использовании HTTP и сервер требует полного или краткого аутентификации. Сигнала обеспечивает указатель QAuthenticator объекта, которое должно быть заполнено учетных данных пользователя. Полномочия затем кэшируются внутренне для управления доступом к сети. В какао, нечто подобное происходит, за исключением полномочий управляются (если вы позволите рамках сохранить ее) на общем экземпляр NSUrlCredentialStorage, которая использует основной пользователь брелок проводить постоянный полномочия.
SslErrors () и готовых () сигналов также доступны в QNetworkReply и это удобный способ справиться с ними, если рассчитывать только один ответ. Нижнего уровня ошибки также выступили QNetworkReply сигнал ошибки объекта. QNetworkReply собирает данные, полученные из сети, и излучает сигналы, которые свидетельствуют о прогрессе, для загрузки и добавления.
С QNetworkReply это подкласс QIODevice, можно открыть входной поток QNetworkReply объекта и процесса входящих ответить на куски, когда это необходимо. Как и другие устройства, данные прибытия сигнализируется eadyRead (), например, когда веб-сервер отправляет ответ с фрагментированное кодирования передачи.
QNetworkAccessManager поставляется с некоторыми полезными классов спутник, которые могут помочь разработчикам в создании полноценного HTTP клиентов. QNetworkCookieJar это конкретный базовый класс, который реализует в памяти печенья хранения. Стойких печенье хранения могут быть реализованы причислять к югу от этого класса.
QNetworkAccessManager управление внутренних печенье с помощью связанных с ним Cookie Jar. QNetworkCookieJar несколько аналогичных NSHTTPCookieStorage.
В какао, NSUrlCache полный стойких реализации кэш. Другой подход используется Qt. QAbstractNetworkCache является кэшем интерфейс, который используется управляющим доступ к сети для сохранения кэшируемого контента и создать ответы на основе кэшированных данных в максимально возможной степени. Этот класс предназначен для вывода и не реализован в Qt 4.4, однако реализация осуществляется от Qt 4,5 года.
В Qt, так же, как и во многих других программных сред, розетки являются средством уровня развитой транспортной инфраструктурой. QAbstractSocket обеспечивает асинхронный объектно-ориентированного связи конечной точки. QTcpSocket, QSslSocket и QUdpSocket известны подклассы.
Threading Взгляд
Оба Cocoa Touch и Qt, обеспечивают определенный уровень контроля потоков, создание системы обмена сообщениями на вершине низкого уровня поддержка потоков. Это та область, где краткое сравнение может оказаться полезным. Используйте свой собственный нити должны быть последним средством: если это возможно, использовать асинхронные API, предоставляемый Qt (например, QNetworkAccessManager).
В какао, темы управляются через NSThread объектов. Темы могут быть запущены в одной из двух способов:
Огонь и забыть использованием detachNewThreadSelector: toTarget: withObject уровне сообщение класса, который создает новый поток и направляет указанное сообщение на объект передается в качестве toTarget параметра. Последний аргумент просто передается сообщение в качестве параметра. Простой версии NObject'ы performSelectorInBackGround: withObject которая делает то же, но сообщение отправляется на текущий объект.
Отправка сообщения на начало потока, который начинается либо со initWithTarget: селектор: объект или инициализации. В последнем случае, п () вызывается метод.
Второй вариант является более общим, и ближе к так, как это сделано в Qt. В Qt, темы могут быть доступны QThread случаях с использованием обычных потоков связанных примитивов к серверу, запрос состояния, изменить его приоритет и отправить его в режим сна. В Qt, отправной точкой нити QThread:: Run () чистого виртуального метода, которые вы должны переопределить. Нить сам начал по телефону QThread:: Start ().
Обе рамки поддерживают концепцию запустить цикл, или, в терминологии Qt, цикл событий. Эти петли, которые ждут не потребляя процессорного времени (практически спать), пока не происходит событие, а затем вызвать правой обработчик для этого события.
Настройка запуска цикла в какао требуется больше усилий, если поток в главном потоке приложения. Обычно в то время как цикл, в котором использованы отдельных итераций называются. Одним из таких итераций ждет сигнала, а затем читает соответствующие источники событий (очереди) и процессов данные, связанные с одного события нашли на них. Таймер источников обеспечить доставку событие в синхронном образом (без обслуживания), тогда как селектор источников содержат сериализованных селекторов звонок в поток таким образом, позволяя отправки сообщений с одного потока на другой, не первый поток необходимости ждать, чтобы сообщение было относительно . Порт источника является основой для ориентированного на соединение между двумя потоками. Запустить итерации цикла имеет режим связанные с ней, что определяет, какие источники проверяются, поэтому он может практически действовать как фильтр на события, которые происходят. В дополнение к настройке запуска цикла, для второй темы какао требует от вас вручную настроить автоматический бассейн релиза, чтобы избежать утечки памяти. Исчерпывающее руководство по этой теме можно ознакомиться на сайте разработчика Apple. См. Многопоточность
В Qt, цикл есть для вас и может быть запущен вызовом ехес () от запуска () метод осуществления, при необходимости цикл. в API Qt проще в использовании для этой цели, хотя и не дает разработчику больше контроля. Тем не менее, пригодный для целей в наиболее распространенных сценариев (и очень близко к родной код платформы Symbian). Как отмечалось ранее, в цикл событий поток может быть запущен с QThread:: Exec () вызова. Прежде чем начать цикл событий, мы должны гарантировать, что какое-либо событие произойдет, и есть обработчик его в код, в противном случае цикл будет ждать вечно. В наиболее распространенных сценариев, событиях Qt приходят как сигналы и обработчики слота (только справедливо, если QObject:: подключить () не использует Qt:: DirectConnection, которые будут просто звонить слот синхронно с поток, в котором сигнал произошло). Qt также упорядочивает гнездо функции называть их, когда нити цикл событий цель может с ними справиться. Используя этот подход гарантирует, что излучающий поток не блокируется при выполнении обработчика, если это специально просил в QObject:: подключить () , указав Qt:: BlockingQueuedConnection в качестве типа подключения. Почему это уместно? Потому что это работает точно так же, как performSelector: onThread: withObject: waitUntilDone сообщений в Cocoa.
Наиболее распространенные утилиты синхронизации также доступны в Qt. NSLockэквивалентно 'S является QMutex. QSemaphore не имеет эквивалента какао, является ближайшим NSCondition, но это может быть легко переведена на QWaitCondition. NSRecursiveLock не имеет аналогов Qt. Только для чтения и записи блокировки присутствует в Qt (QReadWriteLock).
Обе системы поддерживают концепцию потока локального хранения данных: в какао, NSThread класса дает доступ к словарю для хранения пользовательских данных и Qt инкапсулирует его в QThreadStorage шаблона класса.
QThreadPool это служебный класс, который поддерживает ограниченное количество потоков и обеспечивает их сохранение для переработки после того как они завершили свою перспективе. Она работает на экземпляры классов, реализующих QRunnable интерфейс.
Qt не имеет аналогов в NSOperationQueue, которая проходит операции в порядке, который рассчитывается из разработчиков определить зависимость отношения между ними в указанное число потоков. Внутри она перерабатывает темы, как QThreadPool делает, но она более универсальна.
Портирование Пользовательский интерфейс
Интерфейс программирования является достаточно широкой категории, и мы не рассматривать его в подробности. Целью данного раздела является указать на некоторые из вопросов, которые необходимо учитывать.
Поддержка только сенсорный Symbian устройств может показаться, что это естественный выбор при переносе с iPhone или IPod Touch устройств. Тем не менее, это сильно ограничивает число совместимых устройств можно мишени, так как платформа Symbian также доступна на большое количество телефонов, которые не имеют сенсорные экраны. Если вы решили поддержать все или некоторые из них вы должны рассмотреть, как ввод возможности устройства влияет на дизайн вашего переходов интерфейса государства. Например, поставить акцент на активные элементы (например, редактор для командной строки) с помощью навигационных кнопок не удобный по сравнению с простой выбор на устройстве с сенсорным экраном.
При портировании на Symbian, то стоит использовать соответствующие интерфейса стиль руководства, как не только ваше приложение необходимо использовать по своей собственной, но он также должен походить на другие "хорошо вел себя 'приложений на устройство. Для устройств Nokia, стиль руководства можно найти на веб-сайте Форума Nokia.
Инструменты графического дизайна
Обе платформы предлагают прекрасные инструменты для разработки приложений. Когда вы создаете новый проект Qt, Carbide.c + + IDE предлагает выбрать шаблонный код вашего проекта будет базироваться на. QtGUI Главное окно шаблонов проектов соответствуют приложений на основе выбора Окно в XCode. Они оба освобождает разработчика от создания кода, который инициализирует приложение с графическим интерфейсом, в том числе, начиная его цикл событий и создания пустой главного окна программы.
Qt Designer аналогичный инструмент для Apple в Interface Builder, который используется для заполнения пользовательский интерфейс с имеющимися блоков и соединительных свой собственный код с ними. В Qt, составе пользовательского интерфейса хранятся в один или несколько файлов XML с . ш расширений. Одним из примечательных разница между UIKit и Qt является то, что в Qt, этот файл обрабатывается во время сборки создания исходного файла, в котором setupUi () метод отражает соединения, указанные в конструкторе Qt, в UIKit, сгенерированные файлы СИБ загружаются в памяти и обрабатываются во время выполнения.
Инициализация применению
В обеих структур, инициализации приложения будет сделано за вас, когда вы создаете новый проект. Вы вряд ли когда-нибудь, чтобы изменить способ это сделать. В UIKit, делает следующий код инициализации:
Int основных(Int агдс, спаг *агду[])
(
NSAutoreleasePool * бассейн = [[NSAutoreleasePool Alloc] инициализации];
Int retVal = UIApplicationMain(агдс, агду, ноль, ноль);
[бассейн релиз];
возвращение retVal;
)
В Qt основные функции выглядит следующим образом:
Int основных(Int агдс, спаг *агду[])
(
QApplication(агдс, агду);
MyMainWindow ш;
В.шоу();
возвращение А.Exec();
)
Обратите внимание, что какао создает главное окно для вас от MainWindow.xib файл, а с Qt главное окно создается непосредственно в основную функцию. Это на самом деле не объект QMainWindow класс, который обрабатывается, но подкласс нее (если она создана Carbide.c + +, то он автоматически имени вашего проекта). Слотов данного подкласса служить первым обработчиков событий Исходя из основополагающих иерархии виджета.
Блоки интерфейса Строительство
UIKit и Qt поставляются с общих строительных блоков, называемых мнения и виджеты, соответственно. Такие занятия представление слой можно сделать самим и изменять их состояния на получение пользователем событий. Они также уведомляют соответствующие обработчики более высокого уровня, виджет конкретных мероприятий (например, в случае кнопки, такое событие является то, что кнопка была нажата), и они четко определенную семантику, как они ожидают данных должны быть показаны.
Некоторые типичные примеры включают кнопки, списки, контейнеры, линии редакторы, выбора цвета и полосы прокрутки. Полный набор доступных виджетов Qt может быть рассмотрено в Qt виджетов Box вкладке Конструктор Qt. Qt виджетов получить от QWidget класса.
Верхнего уровня виджет (просмотр) в обеих средах это главное окно, которое содержит дальнейшие виджетов (мнений). В UIKit, главное окно UIWindow например, она имеет выдающуюся роль является отправной точкой для событий пользовательского интерфейса с точки зрения иерархии, которую он рассылок далее по цепочке ответчик он поддерживает. В Qt, QMainWindow происходит от QWidget и, следовательно, выступает в качестве верхнего уровня контейнера виджета.
Внимание
Обратите внимание, что QMainWindow не единственно возможный выбор, на верхнем уровне контейнера может быть любой виджет Qt
Ни в одном, ни UIKit Qt вы должны создать в главном окне вручную, если вы используете соответствующие шаблоны, как описано в разделе "Инструменты" выше.
В стадии проектирования UI, виджеты могут быть получены из виджет вкладке окна Qt и потащил к дизайнеру редактора. В результате применения элементы макета и распорки (они не виджеты, даже если они отображаются на вкладке Box Виджет конструктора Qt), вы можете определить, как каждый элемент меняет свое положение, когда его контейнер меняется. В UIKit, то же самое будет частично осуществляется с помощью Размер Interface Builder инспектор вкладку и изменения размеров авто-вариантов.
Индивидуальные виджетов можно полностью настроить через свойство редактора Qt, в котором можно установить такие вещи, как иконки, шрифты, ссылки (для кнопок) и множество других виджетов конкретных атрибутов. Свойствами, а также определены иерархия виджетов, сохраняются в . ш файл. Существует одна большая разница между тем, как эти файлы дескрипторов обрабатываются какао и Qt: . ш файл компилируется в C + + файл класса на этапе сборки. Этот класс имеет специальное название Ui пространства и обрабатывается вашим основным классом окна. Отдельные виджеты могут быть доступны в главном окне класса через его пользовательский интерфейс членов данных. В Cocoa Touch, вы подключаетесь просмотров иерархии вы хотите иметь доступ к соответствующей отверстия источника (это может быть сделано в рамках Interface Builder использованием контрольно-Нажмите на мнения), которые обычно можно найти в вашем контроллере классов .
Дать свои собственные виджеты Qt также возможно. При реализации собственных QWidget-производного класса, он должен:
установить его нужный размер, повторно реализации sizeHint ()
установите его размер политику, используя sizePolicy ()
сделать себя правильно, когда с просьбой главной paintEvent ()
обработки событий, в которых она заинтересована, отменяющего соответствующее событие, методы обработки, например, mousePressEvent ().
Маршрут Виджет конкретные события для обработчиков в какао использовать Target-действий шаблон отправить мероприятий на высоком уровне из пользовательского интерфейса к обработчикам в виде передачи сообщений. В Qt, обычный путь состоит в том, что вы определяете слотов основной экземпляр класса окна, чтобы фиксировать сигналы, посылаемые в рамках иерархии виджетов хранятся в . ш файл. Вы можете подключить виджет сигналы со слотами и на других объектах, но если вы решите это сделать, вы должны делать вручную в то время как соединения с предлагаемым образом вы можете использовать слот редактора Сигнал IDE. Непосредственным следствием является то, что в Qt, контроллеры, как правило, осуществляется в пользовательской подклассов QWidget.
Событие доставки является еще одним примером, где передачи сообщений заменяется сигнал и слот механизм Qt (мы видели, что же происходит в случае между потоками передачи сообщений). Чтобы упростить процесс, Qt автоматически подключается слот для сигнала, если вы используете следующие именования на слот в главном окне класс:
частных слотов:
недействительным on_<имя отправителя>_<сигнал имя>();
где <sender name> это название виджета (вы можете настроить его в редакторе свойств), который испускает сигнал. <signal Name> это имя сигнальную функцию, как определено в заголовок виджета.
Варианты шаблона проектирования Model-View-контроллер
Хороший дизайн отделяет код, в котором хранятся данные (модель), и логика, который манипулирует его из компонентов, которые представляют эти данные пользователя (его). Модель подвергает своих API, которые клиент код можно использовать для запроса и управления данными и запрос уведомления о изменении данных. Например, в приложение телефонной книги, эта модель может возвращать текущее кол-во контактов, дает возможность для перебора контактов и запроса информации о данной связи, а также редактировать и удалять существующих контактов и добавить новую. Благо четко отделен от модели заключается в ее повторного использования.
Третий из основных компонентов в Model-View-Controller (MVC) картина контроллера. Есть четко определенные пути взаимодействия трех компонентов: в оригинальной картины MVC контроллер является объектом, который получает информацию с точки зрения как ответ на определенное событие, пользовательского интерфейса (например, кнопка была нажата) и изменения модель на ее основе. Мнение непосредственно запросов модель данных, потребности, а также получает уведомление от модели, когда его состояние изменяется.
В Qt, контроллер и вид будут объединены, а в какао, контроллер становится посредником между видом и моделью (например, вид и модель полностью отделена). В Qt QListView и QTreeView необходимо использовать вариант MVC. В какао, UITableView требует, чтобы вы использовали отделить вариант, когда вы решите подкласс готовых UITableView класса контроллера.
QListView список виджет, который получает свои данные для отображения от QAbstractListModel объекта. Открыть просит модели карта 'зрения позиция (ее строк и столбцов) в QModelIndex объект, который выступает в качестве какого-то пункта идентификатор целью тянуть дополнительную информацию о модели данного пункта.
Мобильный конкретные интерфейсы
Мобильный конкретных API, обеспечивает доступ к функциям и данным, предоставляемые платформой. Это обычно включает в себя несколько пунктов, которые вы не получите в стандартную рабочую среду. На Symbian устройств это включает в себя:
пользовательских данных, таких, как журналы вызовов, контакты, медиа-файл, профиль и настройки
данных (обработанных или сырья) из встроенных устройств, таких как камеры, GPS датчики и микрофоны
устройства информации о состоянии, например, мощности сигнала или уровень заряда батареи
телефонной связи.
Разработчики приложений iPhone имеют доступ к схожую функциональность с помощью API, такие как AVRecorder, ABAddressBookRef, CLLocationManager, UIImagePicker и UIAccelerometer.
Для Symbian устройств можно получить доступ практически к любой функции поддерживаются устройства с помощью родного Symbian C + +, и это может быть смешано с Qt-код (осторожно). Однако, чтобы избежать необходимости изучать Symbian C + +, Qt обертки для наиболее популярных API, которые предоставляются. Это первый прототип в рамках расширения проекта мобильных и должны в конечном итоге перейти к полностью кросс-платформенный API, как часть проекта Мобильность Qt.
Резюме
В этой статье объяснил, как писать переносимые iPhone / IPod коснуться приложений, а также параметры для портирования на платформу Symbian.
Дополнительная информация
Qt Быстрый старт
Qt Технический обзор
Qt статьи
Перенос статей
Категория: Symbian C + +
Проект мобильных расширений (Forum Nokia)
Портирование iPhone родного (Objective-C) приложений Qt для платформы S60 (Forum Nokia)
Портирование iPhone родного (Objective-C) приложений S60 5th Edition (Symbian C + +) (Forum Nokia)