В данной статье, я поведу речь о разработке пользовательских интерфейсов с помощью библиотеки QT, также мы с вами сделаем краткий экскурс в историю компании Trolltech, и рассмотрим особенности разработки на QT под Mac OS X на небольшом примере.



С чего все начиналось…


Норвежская компания Trolltech, была зарегистрирована в 1994 году, двумя норвежскими парнями – Хаавардом Нортом и Эйриком Чамбе-Энгом. Поначалу ко��пания называлась Quasar Technologies, но позже была переименована в Trolltech.

По долгу службы, Хаавард занимался разработкой объектно-ориентированой системы для вывода информации с аппарата УЗИ. Будучи друзьями еще с университета, ребята всерьез задумались о своем собственном стартапе. Они мечтали разработать наилучшую С++ библиотеку для разработки графических интерфейсов под операционный системы класса Unix.

В 1991 году работа было положено начало эры QT. В 1992 году Эйрик придумал одну из фундаментальных парадигм QT – систему сигнал/слот, Хаавард тут же реализовал эту идею. Так в QT появился собственный препроцессор С++ кода – moc. И уже к концу 1993 года была готово ядро рендеринга, а в следующем году вышла первая версия QT!

Разработать — разработали, а вот продать свой продукт оказалось проблематично. Выхода не было, нужно было искать клиентов, потому как негоже могучим норвежским викингам сидеть на шее своих жен. С помощью старых знакомых, удалось заключить контракт с норвежской компанией Metis, на разработку графического интерфейса на QT.

Дела пошли в гору, и в 1996 Европейское Космическое агентство также стало клиентами Trolltech. Сама QT обрела поддержку Windows, и достигла версии 1.0! Trolltech начали расти, наняли еще двух разработчиков. Старт был позади, парни крепко стояли на ногах, а впереди виднелись неплохие перспективы.

В 1997 году Матиас Эттрих, будущий отец KDE, делает решение создать графическую оболочку под Linux на QT. С релизом первой версии KDE, стало понятно, что QT становится стандартом де-факто разработки графических интерфейсов под Linux.

В 1999 году выходит QT 2, в 2001 появляется QT 3. В июне 2005 года происходит историческое событие – выходит QT 4, значительно улучшенная версия фреймворка. Также под Windows появляется GPL версия библиотеки, QT становится стандартом для кросс-платформенной разработки. К 4 версии QT стал полноценным фреймворком. В нем есть все, что можно пожелать: средства ввода-вывода, контейнеры и алгоритмы, поддержка RPC с помощью D-Bus и многое другое.

Много воды утекло с тех пор… Trolltech достигла размера 250 человек, и открыла офисы по всему миру. В 2006 году компания провела IPO. В январе 2008 года Trolltech объявили, что Nokia сделала им предложение, от которого они не смогли отказаться. Сумма сделки составила 104 миллиона евро, а Trolltech стала собственностью Nokia. Зачем же Nokia понадобились тролли спросите вы. Все очень просто! QT — отнюдь не единственный продукт Trolltech. В 2004 году увидел свет продукт QTopia. QTopia – не что иное, как платформа для мобильных устройств, на основе Embeded Linux и QT. Видимо Nokia усматривает в QTopia замену текущей платформе Maemo, а в будущем возможно даже Symbian.

Отличительная черта Trolltech – их бизнес-модель. QT доступна под двумя лицензиями: GPL и проприетарной. Таким образом, либо вы покупаете лицензию QT и делаете вклад в копилку Trollltech и развития QT рублем, либо пишите открываете исходные коды вашего приложения, делая вклад в развития Open Source и QT в частности.

Краткий обзор возможностей QT


Итак. Для разработки приложений с пользовательским интерфейсом в Mac OS X доступно несколько фреймворков:
  • Cocoa. Данный фреймворк – наследие могучих Next Computer, которым не преминуло воспользоваться Apple.Написан данный фреймворк на Objective C и в настоящий момент именно он является единственной стратегической целью Apple.
  • Carbon. Apple позаботилась также и о разработчиках С++, по этому создала Carbon. Однако времена Carbon – это эпоха Mac OS Classic, в Mac OS X он превращается в бесполезный рудимент, который рано или поздно, возможно даже в Snow Leopard, будет упразднен. Carbon существовал для того, чтобы облегчить портирование сторонних приложений из Mac OS 9 в Mac OS X. В частности, если вы хотите, чтобы ваше приложение было 64 битным и умело адресовать до 64 Гбайт виртуальной памяти, то Carbon – это не для вас. Adobe уже успела обжечься на этом.
  • Фреймворки третьих лиц. Их существует также огромное множество, к примеру WxWidgets, GTK, TCL, однако в этой статье речь пойдет о QT :)

Сейчас QT является довольно мощным инструментом, который здорово расширяет возможности С++. Вдогонку о лицензиях: коммерческая версия QT включает драйвера для RDBS типа DB2 и т.д.

Стоит упомянуть, что интересы QT и Mac OS X пересеклись на движке KHTML. KHTML – движок рендеринга HTML страниц из проекта KDE, который в свое время избрала Apple, как основу для своего проекта WebKit, который посже породил Safari, Google Chrome и другие более мелкие браузеры :) Хотя вся QT часть была из проекта выброшена. К слову о WebKit. В свое время Apple рассматривала также Gecko, как основного кандидата на роль HTML движка. Однако из-за преобладания в Gecko технологии RPC – XPCOM, был избран KHTML.

QT приложения имеют нативный Aqua look, но несколько устаревший. Это связано с тем, что QT использует Carbon для прорисовки виджетов, а современный интерфейс Mac OS X написан в большинстве своем на Cocoa. Тем не менее Trolltech постоянно пытается улучшить внешний вид мак версии и в последних версиях QT появились возможности по созданию нативных для Mac OS X ToolBar меню, а также дополнительных функций по взаимодействию с Dock. Также в QT есть поддержка Growl.

Почему именно QT? Если вам нужно написать небольшое приложение с пользовательским интерфейсом и вы не знаете Objective C, то QT – ваш выбор, потому как учить Carbon не имеет ни особого смысла, ни видимых перспектив. Если же вы имеете приложение на С++, и вам его нужно портировать на Mac OS X, то в пору выбрать QT, потому как С++ имеет определенные ограничения при сопряжении с Objective C кодом. Тем более, обновленная версия QT, которая использует Cocoa для отрисовки виджетов – не за горами, уже доступны первые снапшоты.

От слов к делу


Для начала нам нужно скачать GPL версию QT, это можно сделать с сайта Trolltech http://trolltech.com/developer/downloads/qt/mac

Данные исходные коды нам нужно собрать, причем с возможностью создания Universal Binary (позволю себе напомнить, что Вы должны иметь установленный Apple XCode). Распакуйте QT в удобную для Вас директорию, запустите терминал и выполните следующую строку в каталоге QT:
./configure -universal -sdk /Developer/SDKs/MacOSX10.4u.sdk -fast –static

Данная команда отконфигурирует QT для статической сборки в Universal Binary статические библиотеки. Поскольку UB приложения, собранные статически, занимают довольно много места, рекомендую перед сборкой переименовать папку examples:
mv -R examples examples_

Теперь соберем библиотеку посредством команды make. В зависимости от мощности вашего процессора, сборка может занять от 20 минут до нескольких часов. После завершения сборки, выполняем в терминале следующие команды:
make install
PATH=$PATH:/usr/local/Trolltech/QT-4.4.1/
export PATH

Учтите, что путь к установленной QT меняется от версии к версии. Теперь все готово для дальнейшей разработки.

HelloQT


Итак, создадим простейшее UB приложение с одной кнопкой и текстовой меткой. Для этого в нашей домашней директории создадим папку HelloQT. Запустите QT Designer, он выглядит примерно так:


Создайте Dialog форму и переместите на нее виджеты QPushButton и QLabel. Присвойте им object name helloBt и helloLbl соответственно. Саму форму назовите helloDlg и сохраните результаты наших манипуляций в директорию проекта с именем HelloDlg. Конечный результат будет выглядеть так:


Теперь нам предстоит написать программный код. Создайте файлы HelloDlg.cpp, HelloDlg.h, main.cpp и HelloQT. pro (файл QT проекта) в директории проекта.

В файле HelloQT. pro напишите данные строки:
SOURCES += HelloDlg.cpp main.cpp
HEADERS += HelloDlg.h
FORMS += HelloDlg.ui
CONFIG += x86 ppc

QT использует собственный генератор make файлов qmake. Директивы и формат qmake можно более подробно изучить с помощью QT Asistant. Обратите внимание на последнюю строку, здесь вы явно указываете, что вас интересует именно Universal Binary приложение.

Trolltech пытается улучшить интеграцию QT и наиболее популярных интегрированных сред разработки, но дела обстоят пока не так хорошо как хотелось бы. У вас есть два пути: вы можете компилировать приложение прямо из командной строки, а можете создать XCode проект, чтобы продолжить написание проекта прямо из под этой IDE. Я предпочитаю второй вариант, время от времени генерируя новый файл. Выполните из терминала следующие строки:
qmake -spec macx-xcode HelloQT.pro

Теперь осталась самая важная часть. Измените содержимое файла main.cpp на следующие строки:
#include <QApplication>

#include «HelloDlg.h»

int main(int argc, char *argv[])
{
  QApplication appl(argc, argv);
  HelloDlg mainDlg;
  mainDlg.show();
  return appl.exec();
}

Файл HelloDlg. h должен выглядеть так:
#ifndef _HELLODLG_H_
#define _HELLODLG_H_

#include <QDialog>

#include «ui_HelloDlg.h»

class HelloDlg: public QDialog, Ui::helloDlg
{
  Q_OBJECT

public:
  HelloDlg();
  ~HelloDlg();
  
private slots:
  void onHelloBtClicked(bool);
};

#endif

Ну и наконец HelloDlg.cpp:
#include «HelloDlg.h»

HelloDlg::HelloDlg(): QDialog(NULL)
{
  Ui::helloDlg::setupUi(this);

  connect(helloBt, SIGNAL(clicked(bool)), this, SLOT(onHelloBtClicked(bool)));
}

HelloDlg::~HelloDlg()
{

}

void HelloDlg::onHelloBtClicked(bool)
{
  helloLbl->setText(QString::fromUtf8(«Hello QT»));
}

Остановимся на этом моменте и сделаем теоретический экскурс, чтобы немного пояснить данные строки новичкам в QT. Для реакции на события, т. е. например нажатия кнопки, QT использует свою собственную прадигму сигнал/слот. Поскольку язык С++ не имеет достаточно возможностей, Trolltech решили использовать собственный препроцессор moc, о котором я упоминал раньше. Макрос Q_OBJECT указывает на то, что данный класс содержит слоты и требует специальной обработки препроцессором QT (этот процесс называется moc' ing), каждый такой класс должен прямо или косвенно наследоваться от класса QObject. Директива private slots указывает на то, что данны�� методы класса являются закрытыми слотами, т. е. так называемыми обработчиками событий. Следует добавить, что к одному сигналу можно подключить множество слотов, точно также как и подключить на каждый слот какое-угодно количество сигналов.

Класс Ui:: helloDlg, находящийся в пространстве имен Ui, это класс который создан специальным препроцессором из файла формы HelloDlg.ui (этот процесс называется ui' ing). UI файл – файл формата xml, который описывает форму, подготовленную в QT Designer и ее элементы.

Вот и все, компилируем приложение. Либо из XCode нажатием на cmd + B, либо из терминала командой:
qmake
make

Результаты можно увидеть на скриншотах:



Если вам эта тема интересна, задавайте вопросы в комментариях :)