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

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

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



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

    Похожие публикации

    Средняя зарплата в IT

    120 000 ₽/мес.
    Средняя зарплата по всем IT-специализациям на основании 9 172 анкет, за 1-ое пол. 2021 года Узнать свою зарплату
    Реклама
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее

    Комментарии 22

      0
      «Re: GUI для Python: QT или wxWidgets
      >>Среди всего многообразия GUI остановился на QT и wxWidgets. Если кто-то использует в разработке какой-то из этих GUI, хотелось бы узнать о плюсах/минусах. Спасибо.

      WxWidgets выговаривать труднее. Использую Qt»
        +2
        «В свое время Apple рассматривала также Gecko, как основного кандидата на роль HTML движка. Однако из-за преобладания в Gecko технологии RPC – XPCOM, был избран KHTML».
        Не понял второе предложение. Почему эта технология стала причиной отказа?
          +2
          Потому что Apple посчитала ее bloatware.
            0
            Absolutely.

            Кстати, вот он, исторический email: lists.kde.org/?l=kfm-devel&m=104197092318639&w=2

            Apple to KHTML develoeprs: «The size of your code and ease of development within that code made it a better choice for us than other open source projects. Your clean design was also a plus. And the small size of your code is a significant reason for our winning startup performance.»

            Помню этот анонс… как же были тогда расстроенны мозилловцы.
          0
          Файлы проета нужно создавать вручную? Нет возможности делать это автоматом?
          Я не противник командной строки, но и не сторонник. Сам долгое время программил на C++ под DOS, но с переходом на C++ Builder жаление ковыряться с компилятором в командной строке отпало. В свое время я пробовал работать под Qt (в институте, лет 5-7 назад), но в то время ни о какой «нормальной» совместимости кода с разными платформами речи и не шло. Насколько сейчас хорошо обстоят дела?

          Меня интересует Qt прежде всего как средство создания админки для CMS. Пока у меня она работает в HTML-формате, но это значительно тормозит процесс, т.к. приходиться постоянно танцевать с бубном, чтобы реализовать удобный и безглючный интерфейс для разных браузеров. Соот-но у меня есть несколько вопросов по возможностям системы:

          1. Насколько хорошо она работает с базами данных, с какмими и в каком режиме? Есть ли свой редактор SQL?
          2. Насколько хорошо она работает с XML и есть ли свой Parser?
          3. Есть ли вменяемые доки/учебники (по собственному опыту)?
          4. Какие ограничения есть у OpenSource-версии Qt, кроме обещания разработчика выпускать на ней только OpenSource-продукты?
          5. ну и наконец, есть ли опыт переноса кода и его компиляции на другой платформе?
            0
            Файлы *.pro qmake может создать автоматически, если запустить его с параметром -project, при необходимости его можно «допилить» уже вручную.
              +1
              1. Работает хорошо, есть поддержка почти всех современных БД.
              2. Свой XML парсер — есть.
              3. Обычно хватает QT Asistant, там все хорошо изложенно. Однако 2 года назад даже вышла книга на русском языке по программированию на QT.
              4. Никаких существенных, кроме драйверов для коммерческих БД.
              5. Есть, все достаточно гладко. Конечно интерфейс заточенный под винду выглядит достаточно топорно под мак ос.

              Есть интегратор для Eclipse и Visual Studio, который сам генерирует и вносит изменение в файл проекта.
                +1
                А переносятся ли приложения на Qt на мобильные устройстсва под Windows Mobile? Насколько они совместимы с Win32/MacOS?
                  +1
                  QT есть и под Windows CE/Windows Mobile. Немножко может прийдется поколдовать с размещением элементов. Совместимы с Win32/MacOS — не отлично.

                  QT — это професиональный фреймворк, поддерживается очень хорошо, баги фиксятся тоже неплохо, и он свободен от многих детских болезней WxWidgets.
                  –4
                  Спасибо.
                    +1
                    Да, все именно так, но небольшое дополнение:
                    1) Книг немного больше, чем одна, та что была пару лет назад по Qt3, причем свободно распространяется pdf'кой под Open Publication License, так что можно вполне легально скачать. С годик назад выходила по Qt4 книга, не знаю как она распространяется, но найти в электроне тоже реально. Но на самом деле они НЕ НУЖНЫ, они дублируют официальную доку и туториал, у Qt одна из самых лучших док.
                    2) Интеграция с VS только в коммерческой версии, а так только с Eclipse.

                    ЗЫ: И еще когда собираешь под винду и используешь работу с БД был такой косяк, что нужно оставлять динамическую линковку библиотек, хотя может быть уже пофиксили.
                    +1
                    1. есть модули для работы практически со всеми распространёнными субд. насколько хорошо работает не знаю.
                    2. с XML всё просто прекрасно — есть отличный набор классов, который позволяет делать с XML всякое.
                    3. есть. и даже на русском языке (переводы руководств от авторов кьют).
                    4. на опенсорц нет техподдержки и нет официальной поддержки Visual Studio, хотя её вполне можно пользовать.
                    5. у меня нет опыта работы с маками и переноса на них/с них, портирование же между FreeBSD/Linux/Windows — простая перекомпиляция (если конечно приложение написано адекватно).
                      –4
                      Спасибо. Будем искать время для освоения
                      +1
                      У меня тоже была такая идея — создать платформонезависимую/браузеронезависимую админку, общающуюся с помощью XML-RPC с сервером. Застопорился на проблеме создания адекватного WYSIWYG'а. QTextEdit создает достаточно кривой HTML-код. Например, заголовки H1, H2… он делает так: <p style=«font-size: 20pt; font-weight: bold»>…. Проблема, конечно, решаема сторонними библиотеками (например qt4.4 идет с WebKit'ом), но не было еще времени с этим ковыряться. :)
                      +1
                      Кстати, чтоб не заморачиваться с самостоятельной компиляцией, лучше поставить qt4-mac из macports (плюс поддержка различных вариантов сборки, с учетом зависимостей):

                      macbook: Learning kalyaka$ port info qt4-mac
                      qt4-mac 4.4.1, aqua/qt4-mac (Variants: universal, dbus, noframework, nis, cups, mysql4, mysql5, psql, sqlite, ssl, examples, demos, docs)
                      www.trolltech.com/

                      This is Qt, TrollTech's C++ toolkit for writing cross-platform GUI applications. This version uses the native Aqua UI. For a X11 version, see qt4-x11.

                      Library Dependencies: libmng, libpng, jpeg, tiff, dbus
                      Platforms: macosx
                      Maintainers: erickt@macports.org clubjuggler@gmail.com openmaintainer@macports.org

                        0
                        а причем в заглавии iphone?
                          +1
                          а при том, что это всего лишь название блога :-)
                          +3
                          В целом всё прекрасно, только одно: QT — проигрыватель QuickTime, инструментарий — Qt.
                            0
                            Как-то сумбурно :-( Верно сказали про qmake -project в комментах. Есть замечательная книга «бланшет бук», там очень хорошо все описано.
                              +1
                              правильно название тулкита пишется как «Qt», а не QT
                                +1
                                Раньше это было именно QT, потом последнюю букву уменьшили, потому что аббревиатуре пересекалась с QuickTime.
                                +1
                                если интересно тут форум живет
                                один из самых больших в рунете форумов по QT

                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                Самое читаемое