Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Разработка приложений с использованием Qt, часть 1

Оригинал: Developing Apps on Qt, Part 1
Автор: Manoj Kumar
Дата публикации: 31 января 2012 г.
Перевод: А.Панин
Дата публикации перевода: 5 ноября 2012 г.

Данная статья является вводной статьей серии, описывающей процесс разработки приложений с графическим интерфейсом на основе фреймворка Qt.

В течение длительного времени разработка приложений происходила без использования сторонних компонентов. Впоследствии появилась концепция повторного использования кода. Статические и разделяемые библиотеки создавались для использования в разработке приложений, но процесс эволюции на этом не остановился; разработчики приложений приступили к работе над программными фреймворками. Хотя библиотеки и фреймворки имеют ряд сходных функций, между ними существуют значительные отличия, которые необходимо понимать:
  • Библиотеки позволяют использовать концепцию повторного использования функций, в то время как фреймворки представляют возможность использовать концепцию изменения поведения. Например, библиотека может предоставлять классы для работы с TCP- и UDP-сокетами, в то время как фреймворк может представлять класс для абстрактного сокета.
  • Библиотека позволяет обрабатывать сигналы и события с помощью специальных функций, в то время как фреймворк предоставляет возможность взаимодействовать напрямую с системой и другими программными компонентами.
  • Функции библиотек вызываются из кода приложений, а фреймворк тесно интегрируется в приложение - или, можно сказать, дополняет код приложения.

Приложения для настольных компьютеров

Приложения для настольных компьютеров в значительной степени зависят от платформы, на которой они работают. Приложение, скомпилированное для ОС Linux, не может работать в другой операционной системе без использования эмуляторов по причине различий в системных вызовах и библиотеках в этих операционных системах. Необходимо было найти возможность разработки платформонезависимых приложений.

Одним из методов является разработка версий библиотек для всех необходимых платформ, не изменяя код приложения, а просто перекомпилируя его для каждой платформы. Этот подход облегчал жизнь разработчикам до того момента, как компания Sun Microsystems представила революционную концепцию виртуальных машин, подарив миру платформонезависимый язык программирования Java. Приложения Java исполняются при помощи виртуальной машины Java (Java Virtual Machine). Код, написанный однажды, может быть развернут на любой платформе, для которой доступна виртуальная машина Java.

Но за все приходится платить. В случае с языком Java приходится расплачиваться производительностью. Производительность приложений на Java не настолько высока, как у приложений на C/C++, скомпилированных в машинный код. Другим недостатком является большое потребление памяти этими приложениями. Без сомнения, язык Java занимает лидирующие позиции, но на сегодняшний день существуют приложения, обрабатывающие большие объемы данных (например, в области биотехнологии) с особо жесткими требованиями к производительности. И снова мы сталкиваемся с необходимостью разработки приложений, компилируемых в машинный код. Разработка приложений на языке C занимает много времени, в то время как C++ является лучшим решением. Имеется ряд фреймворков, предназначенных для использования при разработке приложений на C++. Фреймворк Qt является одним из них.

Краткое описание Qt

Qt является кроссплатформенным фреймворком для разработки приложений от компании Trolltech, а на данный момент владельцем кода является компания Nokia (на момент перевода статьи компания Nokia передала разработку Qt компании Digia - прим.пер.). Фреймворк предоставляет API на языке C++. Qt часто используется разработчиками для разработки кроссплатформенных приложений.

При помощи Qt можно разрабатывать приложения с графическим интерфейсом, приложения, работающие с сетью, приложения, работающие с базами данных и мультимедийные приложения, работать с XML-структурами и 3D-графикой, осуществлять рисование и доступ к сетевым ресурсам. Поскольку поддерживается ряд платформ, Qt может работать на Linux, Mac OS, Windows, Meego, встраиваемых Linux-системах и Symbian.

Архитектура Qt

Простейшая схема, демонстрирующая архитектуру Qt, представлена на Рисунке 1.

Архитектура Qt
Рисунок 1: Архитектура Qt

На верхнем уровне находится код программы на языке C++. Уровнем ниже расположены классы Qt для создания графического интерфейса, взаимодействия с WebKit, работы с базами данных и.т.д., а еще ниже расположен уровень поддержки различных операционных систем. Ранее Qt поддерживал также язык программирования Java; версия для языка Java называлась Jambie. По мере продвижения разработки Qt, становилось все сложнее поддерживать версии для C++ и Java, поэтому и было принято решение поддерживать только версию для C++.

Установка Qt

Методы установки отличаются в зависимости от операционной системы. В ОС Ubuntu 10.04 LTS я установил Qt при помощи менеджера пакетов Synaptic - при установке пакета qtcreator по зависимостям будут установлены Qt Assistant, Qt Designer, Qt Linguist и Qt Creator.

Если вы хотите попробовать новейшую версию Qt, можете скачать установочный пакет с официального сайта и установить его. От вас требуется только позволить исполнение установочного пакета как программы при помощи команды chmod и запустить его, после чего следовать инструкциям.

Программа 'Hello World' (без графического интерфейса)

Откройте терминал. Создайте директорию с названием first и простейшую программу "Hello World" со следующим кодом:
#include<QtCore>
int main(){
	qDebug() < "Hello world\n";
}

Подключенный заголовочный файл QtCore содержит описания классов, не использующих графический интерфейс. Их мы рассмотрим в подробностях в следующих статьях. На данный момент будем просто использовать класс qDebug, который выводит отладочные сообщения в консоль и обладает функциями, эквивалентными cout при программировании на языке C++.

Как же скомпилировать эту программу? Разработчики из компании Trolltech представили простое решение для осуществления кроссплатформенной компиляции. Для начала должен быть создан файл проекта, на основе которого будет сгенерирован файл Makefile. После этого просто введите make для компиляции программы. Когда вы устанавливаете пакет Qt Creator, утилита qmake устанавливается вместе с ним. Она является кроссплатформенным генератором файлов Makefile для Qt. Чтобы узнать больше об этой утилите, обратитесь к странице руководства. Выполните команду qmake -project для создания файла проекта (файла с расширением .pro и именем, идентичным имени директории проекта, т.е. first).
$ cat first.pro
######################################################################
# Automatically generated by qmake (2.01a) Mon Nov 28 05:49:29 2011
######################################################################

TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .

# Input
SOURCES += main.cpp

Вы можете создавать как приложения, так и библиотеки; значением параметра TEMPLATE является app, говорящее о том, что разрабатывается приложение. Я затрону тему разработки библиотек в следующих статьях серии. Аргументом параметра SOURCES является список файлов исходного кода в рамках проекта, подробнее об этом будет сказано далее.

Теперь давайте сгенерируем файл Makefile при помощи утилиты qmake. Это длинный файл - он может содержать до 200 строк. Запустите команду make для компиляции исполняемого файла:

В последней строке вы можете заметить то, что наша программа использует также библиотеку для работы с потоками POSIX. Запустите программу при помощи команды ./first, чтобы увидеть вывод "Hello World". Программа работает! Только что мы успешно скомпилировали нашу первую программу.

Программа с графическим интерфейсом

Qt предоставляет возможность визуального проектирования графических интерфейсов методом drag-and-drop и автоматического создания файлов описания графических интерфейсов, которую мы рассмотрим в следующей статье. Сейчас же мы опишем вручную графический интерфейс нашей новой программы:
#include<QApplication>
#include<QLabel>

int main(int argc, char *argv[]){
	QApplication a(argc, argv);
	Qlabel	label;
	label.setText("Hello World");
	label.show();
	a.exec();
}

В нашем первом примере у программы не было графического интерфейса. Программа завершалась при возвращении из функции main. Тем не менее, мы не можем поступить также в программах с графическим интерфейсом, поскольку программы будет невозможно использовать. Мы хотим, чтобы графический интерфейс работал до того момента, как пользователь закрывает окно. Для этого необходимо, чтобы программа работала в цикле до того, как пользователь закроет окно, поэтому следует использовать класс QApplication, в котором реализован цикл приема событий. Когда вы создаете экземпляр этого класса и вызываете его метод exec(), функция main не возвращает управления. Приложение находится в режиме ожидания событий от пользователя.

Второй заголовочный файл содержит описание класса QLabel, представляющего из себя простой виджет для вывода текста. Создайте экземпляр этого класса и установите текст "Hello World". При вызове метода show() виджета, он отображается в виде окна. Таким образом, виджет будет выглядеть как окно. На Рисунке 2 можно увидеть это окно с заголовком. Вы можете изменить размеры окна просто при помощи мыши.

Qt. Виджет строки
Рисунок 2: Виджет строки

В следующих статьях мы рассмотрим основные классы Qt. Между тем, я рекомендую вам внимательно рассмотреть официальную документацию Qt.