Архив за месяц: Март 2014

Qt для начинающих. Введение

Вернуться к общему содержанию "Qt для начинающих".

История Qt разработки началась примерно в начале 90-х, однако только в 1995-м году, разработки Qt стали известны программному миру. Для тех, кто знаком с Java, может показаться, что похожи не только периоды становления Qt и Java, но и система классов в какой-то степени перекликается. Трудно избавиться от мысли, что эти разработки как-то коррелируют между собой и основное их различие только в том, что Qt это кроссплатформенная система, которая позволяет на основе исходников получить сборки под разные платформы, а Java — межплатформенная система, которая позволяет откомпилированный байт-код запустить на виртуальных машинах из под разных платформ.

Называть Qt просто библиотекой классов не совсем верно. На основе возможностей описания макросов в C++, Qt реализует некую макросистему, часть которой обрабатывается специальной утилитой MOC (Meta Object Compiler). MOC генерирует специальные файлы на языке C++, которые включаются в общую сборку и в которых заключена некоторая магия взаимодействия классов. Не углубляясь в детали, можно говорить о том, что Qt это специальный язык, построенный на основе возможностей C++. Однако, следует четко понимать, что хотя программа на Qt и включает в себя некоторые символы требующие обработки специально разработанным метакомпилятором, но в конечном представлении мы имеем дело с языком C++, поэтому не все соглашаются с терминологией "язык Qt". Возможно, меньше споров будет если считать Qt одним из вариантов кроссплатформенных фреймворком для языка C++.

Кроме метакомпилятора MOC, без которого реализовать возможности Qt невозможно, следует упомянуть еще компилятор графического пользовательского интерфейса — UIC (User Interface Compiler). Этот компилятор, на основе XML-описания оконных форм генерирует систему файлов C++, которые описывают форму в терминах C++/Qt. Для визуальной работы с XML-описанием формы разработано приложени QtDesigner. Таким образом, открыв QtDesigner можно напрямую или внутри среды разработки QtCreator выполнить визуальное проектирование формы. Далее, она будет обработана компиляторами UIC и MOC, после чего, полученные файлы на языке C++ могут быть откомпилированы компилятором с языка C++. При использовании среды разработки QtCreator все это будет выполняться автоматически.

Следует заметить, что не смотря на наличие инструментов визуального проектирования форм, пользоваться ими не рекомендуется по следующим причинам.

  1. При изменении версии XML-описания файла формы могут возникнуть сложности в сопровождении старых проектов. После перекомпиляции одного из таких проектов при смене версии Qt SDK возникли необъяснимые падения форм следанных через визуальное проектирование. В процессе поиска и решения этой проблемы пришлось сначала пересобрать все формы, а только потом, все-таки, наигравшись еще и с другими проблемами визуального проектирования, упрямые юнцы перепроектировали свои формы вручную.
  2. Визуальное редактирование сложных форм практически невозможно. Приходится уничтожать рад компановочных элементов, вносить изменения в виджеты и восстанавливать компановку. Если кто-то фамильярно знаком с проектированием форм под Android SDK, что редактирование форм в XML файлах проще производить напрямую, нежели через визуальные редакторы. В случае с Qt это выглядит так же. При участии в проектах, где несмотря на рекомендации, все-таки используют визуальное проектирование, вносить изменения в чужие формы не поломав нелепое и неподдающееся осмыслению нагромождение компоновщиков можно только через ручное редактирование XML. Возможно это вариант, если не учитывать предыдущее замечание, но, если быть разумным, то значительно проще редактировать аккуратно написанный код создания формы на языке C++.
  3. Нельзя не согласиться с тем, что удобный проект, это проект, который не зависит от среды разработки. В этом случае, скачав исходные коды проекта из репозитория вы можете включиться в работу используя любымый вами инструмент разработки. Если вы хотите работать над проектом средствами консольного редактора vim и выполнять сборку проекта прямыми консольными средствами, то неправильно будет это запрещать, учитывая, что если уметь пользоваться этим средствами, то они становятся очень эффективными для внесение небольших изменений в проекты любой сложности. Следовательно, если у вас есть возможность делать такие проекты, то следует делать именно такие проекты. Какая-либо привязка к визуальным редакторам и версиям этих редакторов или форматов файлов визуальных описаний может привести к множеству проблем. И вероятность этих проблем тем больше, чем большее количество разработчиков работает в проекте.

В связи с этим хочется привести следующие наблюдения. Проекты от крупных успешных компаний ведутся без использования визуальных сред проектирования. Если приложение пишется годами, то наивно предполагать, что экономия в несколько минут, которое может дать визуальное проектирование, что-то решает. Для тех, кто имеет хороший опыт разработки, не требуется много времени на ручное описание формы. Возможно даже, что они сделают некоторые формы руками быстрее, чем с использованием визуальных средств. Если же вы не серьезный профессионал, то врядли вы работает в крупной успешной компании на серьезных проектах. Учитывая проблемы, которые ожидают проект при использовании визуального проектирования, в таких компаниях, подобные вопросы явно прописаны в правилах разработки. Таким образом, визуальные средства остаются только для новичков которые еще не разобрались в вопросе, и для упрямых юнцов, которые отстаивают свое мнение до тех пор пока имеют такие возможности.

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

Система классов Qt очень обширна. Она включает в себя не только средства GUI, как принято считать согласно одному устойчивому заблуждению. Qt включает в себя свою систему контейнеров, обширные средства сетевого и межпроцессового взаимодействия и межпотокового взаимодействия, средства управления процессами и потоками, средства обработки файлов различных форматов, от XML до динамических библиотек, графику 2D и 3D, скриптовые расширения для развития конечных приложений и интерфейсов, поддержку WebKit c HTML5 и многое другое. Библиотека классов активно расширяется. Среди заметных дополнений в Qt5 можно назвать кроссплатформенную поддержку системных служб.

Одно из заблуждений, которые сопровождают развитие библиотеки Qt, является ее низкая эффективность в контексте быстродействия. Действительно библиотека использует некоторые run-time механизмы связывания, построенные на текстовых таблицах, сходные с реализацией ООП в Objective-C, но при грамотном использовании это не является проблемой, так же как это не является проблемой в Objective-C. Наоборот, Qt очень эффективная и красивая библиотека, которая имеет одну серьезную проблему — "плохих танцоров". Изучайте библиотеку грубже. Я был свидетелем того, как переписывание одного неудачно реализованного GUI-компонента на архитектуре Model-View ускорило его работу в несколько десятков раз. Компонент развертывал карту параметров включенного оборудования. В неудачной реализации, уже развертывание первой сотни параметров длилось утомительно долго. При этом, в удачной реализации, так и не удалось загрузить компонент настолько, чтобы он не смог развернуть карту мгновенно.

В данном руководстве будут рассмотрены версии Qt4 и Qt5. Если вы только начинаете изучать Qt, то выбор между версиями Qt4 и Qt5 особого значения и не имеет. Хотя они и имеют существенные различия в своей организации, но с достаточной уверенностью можно считать, что базовая система классов и их базовая функциональность остались без изменений. При переходе с версии Qt3 на Qt4, и, особенно, с Qt2 на Qt3, различия были значительно заметнее.

Для работы с руководством рекомендуется настроить для работы операционную систему Linux. Для этого в ней следует установить следующий список программ.

  1. Компилятор с языка C++ из GCC (GNU Compiler Collection).
  2. Qt SDK. Можно поставить только одну версию, например, Qt4. Если вы установите SDK для обоих версий (Qt4 и Qt5), то, возможно, потребуется дополнительная настройка среду разработки. Кроме того, при создании проектов, потребуется учитывать выбор версии Qt SDK.
  3. CMake. Это кроссплатформенная система сборки, альтернативная системе QMake. QMake является традиционной системой сборки для проектов Qt, но имеет некоторые проблемы с разрешением зависимостей при внесении изменений в код проекта на уровне элементов метакомпиляции. Часто, имеет смысл использовать систему сборки CMake, которая требует больших знаний, но является более удачной.
  4. QtCreator. Среда разработки для проектов Qt. Примерно с 2010-го года, эта среда разработки стоит в лидерах по своей эффективности и эргономичности. Отлично подходит для работы с любыми проектами на языке C++. Сначала была ориентирована на систему сборки QMake, но с некоторых пор начала поддерживать и CMake.

Если вам требуется настроить рабочее место под Windows, то для работы с данном руководством можно порекомендовать установку среды разработки QtCreator с требуемой версией Qt SDK. Чтобы максимально соответствовать особенностям данного руководства, следует выбирать сборку QtCreator и QtSDK построенную на основе пакета MinGW (Minumum GNU for Windows). Следует еще проследить за тем, чтобы в составе MinGW содержался отладчик gdb.exe.

Если вы не особенно фамильярны с установкой и настройкой приложений под Windows, то подумайте еще раз над тем, чтобы использовать Linux. Эта операционная система рождена для задач программирования и, кроме того, в большинстве современных дистрибутивов, установка приложений из репозитория делается несколькими щелчками мыши. Репозиторием, здесь, называется огромное хранилище приложений специально подготовленных под установку для конкретной версии дистрибутива. Удобно иметь дело с сетевыми репозиториями. Приятной особенностью установки приложений из репозиториев является тот факт, что вы врядли столкнетесь с проблемами совместимости требуемых вам пакетов. Linux, для начала, можно установить на виртуальный компьютер, например, на VirtualBox. Выбор дистрибутива для новичка должен определяться тем, какой дистрибутив использует человек, к которому новичок может обратиться с помощью. Если таковых не имеется, то можно посоветовать начать знакомство с Linux установив дистрибутив Ubuntu.

На момент написания данных строк (март, 2014), поддержка Qt осуществлялась с двух ресурсов Интернет:

  1. http://qt-project.org — Qt Project — некоммерческая версия.
  2. http://qt.digia.com — Qt Digia — коммерческая версия.