Pull to refresh

Пользовательский интерфейс по-норвежски, или пишем на QT

Reading time 7 min
Views 13K
В данной статье, я поведу речь о разработке пользовательских интерфейсов с помощью библиотеки 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

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



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

Articles