sonyps4.ru

Язык qt. Почему я люблю Qt и вы все тоже должны его любить

Все знают, что KDE базируется на библиотеке Qt , а вот что это такое знают не все.

Qt - это кросс-платформенная библиотека C++ классов для создания графических пользовательских интерфейсов (GUI) от фирмы TrollTech. Эта библиотека полностью объектно-ориентированная, что обеспечивает легкое расширение возможностей и создание новых компонентов. Она поддерживает огромнейшее количество платформ, таких как Windows 95/98/NT/2000, Linux, Sun Solaris, HP-UX, Digital Unix, IBM AIX, SGI IRIX и многие другие. С момента первого появления коммерческой версии Qt в 1996 году появилось несколько сотен известных по всему миру приложений. Самой известной разработкой на базе Qt является десктоп менеджер для X-Windows называющийся, как уже многие догадались, KDE.

Существует две версии библиотеки Qt: бесплатная и платная. Бесплатная версия называемая Qt Free Edition предназначается только для Unix/X11 и разработки программ с открытым исходным текстом. Для разработки коммерческих программ предназначается версия Qt Professional Edition.

Для библиотеки создания GUI объектно-ориентированный язык является единственно пригодным средством, а стандартная объектная модель C++ обеспечивает эффективную и быструю разработку программ, наращивание неограниченных возможностей и быструю модернизацию. Естественно из-за этого в качестве базового языка для библиотеки выбран C++. Но в дополнение к возможностям самого языка в библиотеке Qt добавлены несколько хороших возможностей:

  • мощный механизм коммуникации между объектами с помощью сигналов и слотов
  • механизм создания свойств объектов, которые не поддерживает компилятор C++
  • поддержку событий и фильтров событий
  • перевод строк для поддержки интернационализации
  • поддержку внутренних таймеров, которые позволяют интегрировать многие задачи для событийных GUI
  • иерархические деревья объектов, являющихся своего рода генеалогическими деревьями: "прадедушка - дедушка - отец - сын", предназначенные для организации внутреннего взаимодействия в "натуральном" виде
  • "охраняемые" указатели, которые автоматически устанавливаются в NULL при удалении объекта, на который ведет ссылка

Все эти возможности реализованы в виде специальных классов C++. Появление новых современных требований к пользовательским интерфейсам влечет за собой и появление новых нестандартных механизмов, которые сам язык программирования обеспечить не способен, а лишь после создания специализированных классов.

X-Stranger

Использование материалов сайта Linux.HiTECH.BY разрешено со ссылкой на первоисточник.
Материалы распространяются под GNU/GPL.

Естественно, из меня писатель как из бутылки молоток, так что уж простите, если увидети выдержки из какой-либо знакомой вам доселе не обессудте:-)))
И огромное спасибо uj за оказанную помощь в разработке статьи!!! Респект:-=))
И так... поехали!...

1. Что такое QT?
=================
Qt -- это кроссплатформенная библиотека, целью которой является вытеснение нативных API из ваших
программ. Сейчас Qt -- это огромный объектно-ориентированный комбайн, в большинстве случаев
позволяющий обойтись без привлечения каких-либо иных библиотек.
В первую очередь Qt -- отличное средство для создания графического пользовательского
интерфейса (GUI). В состав Qt входит дизайнер, позволяющий легко создавать графические интерфейсы
для вашего приложения.
Вам не придется заботиться о написании файлов сборки для каждой из платформ, за вас это сделают Qt.
Достаточно просто написать файл проекта, в который внести все используемые файлы, и файл
сборки можно будет создать одним вызовом утилиты qmake (естественно, под управлением целевой
платформы). От себя добавлю, что иногда этот файл приходится править руками (а как же).
О значимости данной библиотеки говорит хотя бы то, что она используется в таких успешных проектах,
как Borland C++ Builder 6 и Opera.

2. Где достать?
================
Библиотека поставляется по нескольким лицензиям, одни из которых -- платные, другие -- нет. Под
оконную систему X11 всегда можно с сайта www.trolltech.com легально
взять GPL-версию Qt (и использовать, естественно, только
в некоммерческих проектах). С системой Windows дело обстоит сложнее, поскольку, по мнению верхушки
TrollTech, эта система не является ареной OpenSource-разработки. Последняя бесплатная версия для
Windows -- 2.3.0. Но для находчивых людей это не проблема, есть сеть eDonkey ;-) Текущей на данный
момент является версия 3.3.1. В скором времени ожидается версия 4.

3. Технические подробности
=============================
Изначало Qt "работало" на пользовательский интерфейс. И именно поэтому эта часть библиотеки наиболее
используема и наиболее развита. Интересен подход к позиционированию виджетов (виджет -- элемент
GUI, всё что рисуется на окошке, включая его само) -- система слоёв (layout) позволяет вам забыть об абсолютном позиционировании, как о страшном сне. Теперь класс Layout сам следит за тем, что вы делаете с, например, главным окном и позиционирует все внутренние виджеты вслед за изменением геометрии этого окошка.
Центральной идеей Qt является сигнально-слотовый механизм, реализующий взаимосвязь между объектами.
Этот механизм реализован посредством прекомпиляции, что позволяет использовать его без всяких
ухищрений (если вы заинтересованы в Qt, прямо в данный момент забудьте о callback-вызовах).
Каждый Qt-объект (не только вызуальные элементы!) может генерировать некоторые сигналы, жестко
зашитые в структуру его класса. Сигнал -- это функция, объявленная в специальной секции signals
и не имеющая реализации ("тела") а только передаваемые аргументы. К сигналу объекта (заметьте, не класса) могут быть подключены слоты. Слот -- это всего лишь метод, также объявленный в специальных секциях "slots". Слоты
могут быть доступными (секция "public slots"), защищенными ("protected slots") и
скрытыми ("private slots"). При помощи специального метода connect слот подсоединяется к сигналу.
Небольшой пример:

Connect(myValueDetector, SIGNAL(ValueChange(Value a),
myApplicationUpdater, SLOT(onValueChange(Value a))));

После чего при каждом "испускании" сигнала ValueChange объектом myValueDetector
будет вызываться слот onValueChange объекта myApplicationUpdater.
Плюсы -- к одному сигналу можно подключить несколько слотов.
Минусы -- один слот нельзя использовать для нескольких сигналов (например, для обработки группы кнопок). Сравните с системой событий VCL/CLX -- там как раз всё наоборот. Рассмотрим небольшой пример использования сигнально-слотового механизма:

Как видите, код "немного" отличается от стандартного C++. Данный текст подаётся на вход мета-компилятора moc, который из него уже производит стандартный код C++, который затем компилируется любым компилятором. Moc отличает "свои", т.е. поддерживающие сигнально-слотовый механизм, классы от стандартных по ключевому слову Q_OBJECT в самом начале объявления класса.

Перечислим основные достоинства ядра библиотеки Qt:
* встроенная поддержка Unicode и локализации (очень хорошо и очень правильно реализованной, смею
заметить). В Qt4 обещают новый механизм рендеринга шрифтов, поддерживающий Unicode.
* мощные события и фильтры событий (событие - это что-то вроде универсального сигнала, который можно посылать любому виджету, распознавать и соотвествующим образом обрабатывать с помощью фильтров. Например нажатие различных клавиш)
* многофункциональные управляемые интервалами таймеры которые делают возможным просто и быстро
вставлять много разных заданий в управляемый событиями ГПИ.
* иерархические и настраиваемые объектные деревья, организующие принадлежность объектов естественным
образом.
* защищенные указатели QGuardedPtr, которые автоматически принимают значение NULL при
уничтожении соответствующего объекта, в отличие от обычных указателей в C++, которые в этом
случае становятся "неопределенными указателями".
* Удобная документация, доступная и на русском языке (ссылки к сожалению не знаю, но могу с удовольствием выслать по заявке).

В состав ядра библиотеки входят как классы для построения GUI (например: метка, поле ввода, кнопка и
т.п.), так и классы, предназначенные для организации различных струтур хранения данных (например,
списковых), работы с файлами, сетевого взаимодействия и многого другого. Некоторые из этих
возможностей реализованы в виде дополнительных модулей:
* модуль Canvas, мощный инструмент для работы с двухмерной графикой. Он использует принцип
структурирования графики, что, несомненно, будет полезно в программировании простых двухмерных
игр и подобного рода вещах. Холст состоит из нескольких "элементов", каждый элемент представлен
объектом. Поддерживается также ряд интересных возможностей, таких как collision-detection, перемещение(нет во фришных версиях под виндой:-((()
объектов с определенными скоростями по осям. Подробнее читаем по ссылке:
Ссылка
* модуль Network, обеспечивающий поддержку сети в приложениях.
* модуль OpenGL, позволяющий работать с трехмерной графикой при помощи портабельной библиотеки
OpenGL. Поддерживается с версии 2.3.2.
* модуль SQL, реализующий доступ к базам данных из приложений Qt. Данный модуль разбит на три уровня:
пользовательский (элементы интерфейса), программный (абстрактный доступ к базам данных) и уровень
драйверов.
* модуль Table, предоставляющий в ваше распоряжение сетку для отображения табличных данных. Сетка
являет собой очень мощный и гибкий интерфейс, работать с которым -- одно удобольствие
* модуль XML, использующий интерфейс SAX2 и реализацию DOM второго уровня.

Это далеко не полный перечень возможностей Qt.

3. Как написать простенькое приложение на QT?
=================================================
Напишем файлик main.cpp следующего содержания:

Теперь напишем файл проекта под это дело (simple.pro):

PROJECT = simple
TEMPLATE = app
CONFIG = qt warn_on debug
SOURCES = main.cpp
TARGET = simple

В командной строке наберем:

qmake simple.pro

И теперь черед утилиты make: приложение готово Запускаем, наблюдаем окошко с кнопочкой.

После суток жизни поста я начал замечать утечку кармы, так что заранее прошу прощение за возможно недопустимый стиль изложения в статье и субъективизм

Привет, Хабрахабр!

Последнее время я не мог не обратить внимание на популярность темы Qt на хабрике, но тем не менее, в комментах продолжают встречаться люди, которые говорят откровенно лживые и непонятные вещи. Этим постом я хотел развеять малость заблуждений о Qt и рассказать, почему же ты должен пересесть со своих Java/Obj-C/.NET на мягкий и пушистый Qt .

Под катом будет много впечатлений, субъективностей и моих скромных мнений на счет самого замечательного фреймворка для разработки приложений. Впрочем, я постараюсь добавить интересностей, чтобы моя статья приобрела хоть какой-то техническополезный смысл. Надеюсь, получится занимательное чтиво и вам понравится.

Ну, что, поехали?

Вешч №1. С++ API

Ни для никого не секрет, что у Qt очень удобное API, а конкретнее говоря, модуль qtbase содержит достаточное количество классов для большинства повседневных задач (Qt - это больше, чем GUI фреймворк, лол ). Я уже говорил об обертках STL-ных контейнеров в своей статье трехгодичной давности - тыцк . Классы для работы со строками, отладочный вывод, и много-много чего, так же included.

QString fruits = "apple, banana, orange, banana"; QStringList fruitsList = fruits.split(", "); qDebug() << fruitsList; // выведет в консоль [ "apple", "banana", "orange", "banana" ] fruitsList.removeDuplicates(); fruits = fruitsList.join(", "); qDebug() << fruits; // выведет в консоль "apple, banana, orange"
Стоит сказать, что у Qt также есть модули для удобной работы с XML, базами данных (с интеграцией вкусной-превкусной кьютешной системой MVC ), OpenGL, аудио/видео-работы (Phonon), сетевого программирования, WebKit2. Для больниства задач, которые стоят перед среднестатистическим проектом - этой кухни хватает в 90% случаев, а с модулями редко случаются з*ебы.

С учетом моей любви к C++, я очень и очень сильно доволен тем, какую поддержку различных нетривиальных вещей Qt представляет на кросс-платформенном уровне. Пару раз приходилось разруливать особо непонятные моменты, но это такое.

Вешч №2. Qt Quick

Qt Quick - это мегасмачный подход к созданию графического пользовательского интерфейса. Используя декларативный язык QML (угадайте, где его придумали, лол), похожий на JavaScript, можно добиться высокой производительности при прототипировании интерфейса в приложениях любой сложности. А самое забавное, что при таком ходе дел, с прототипированием интерфейса может справиться даже дизайнер, который знает синтаксис JavaScript . Это все были бы пустые слова, если бы я не показал вам пример функционального кода (больше можно найти на Qt Project - тамц).

Import QtQuick 2.0 Rectangle { id: page width: 320; height: 480 color: "lightgray" Text { id: helloText text: "Hello world!" y: 30 anchors.horizontalCenter: page.horizontalCenter font.pointSize: 24; font.bold: true } Grid { id: colorPicker x: 4; anchors.bottom: page.bottom; anchors.bottomMargin: 4 rows: 2; columns: 3; spacing: 3 Cell { cellColor: "red"; onClicked: helloText.color = cellColor } Cell { cellColor: "green"; onClicked: helloText.color = cellColor } Cell { cellColor: "blue"; onClicked: helloText.color = cellColor } Cell { cellColor: "yellow"; onClicked: helloText.color = cellColor } Cell { cellColor: "steelblue"; onClicked: helloText.color = cellColor } Cell { cellColor: "black"; onClicked: helloText.color = cellColor } } }

Имплементация объекта Cell крайне тривиальна и определена таким образом

import QtQuick 2.0 Item { id: container property alias cellColor: rectangle.color signal clicked(color cellColor) width: 40; height: 25 Rectangle { id: rectangle border.color: "white" anchors.fill: parent } MouseArea { anchors.fill: parent onClicked: container.clicked(container.cellColor) } }

В этом коде нету ни строчки С++ и он нормально работает. Годно, не так ли? Я себя даже волшебником от этого почуствовал - проще в магазин за хлебом сходить, чем приложение вот такое склепать. Тем не менее, в сложных приложениях не хватает одного QML и мы объединяем его с С++. Об этом шла речь в многих статьях хаба Qt Software - например, тамц .

Вешч №3. Сообщество

Ну вот мы и дошли до приятного момента. Если говорить о мне, то я работаю с Qt относительно мало - всего 5 лет. Qt проводит ежегодные мероприятия - Qt Developer Days и Qt Contributors" Summit. Я был на каждом из них по одному разу, в прошлом году, и мне очень понравилось - уровень подготовки высокий, а впечателения доставляют. Мне также приходилось общаться с «ветеранами» Qt - людьми, которые посещали саммит на протяжении 10 лет. Представляю, насколько круто на своих глазах видеть рост такого проекта и быть в эпицентре всей разработки - просто смачненько.

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

Вешч №4. Открытый исходный код и code review

Сорец кьюта открыто разрабатывается в основном, компаниями Digia (комм. поддержка +), KDAB, ICS и энтузиастами-разработчиками. Хостится все это дело на Gitorious - тадамц . Чтобы внести свою лепту в развитие проекта, нужно пройти строгую проверку кода - автоматизированную (соблюдения стиля кода, о котором я уже писал ранее - птссс) и человеческую - твой код будут смотреть бородатые дяди, которые не доверяют тебе и будут искать в твоем коде бэкдоры. Все это достаточно сложный процесс (заморочки с Git / ревизии на Review Board) и я наверное напишу об этом статью на днях.

У меня, к слову, есть пару коммитов в дереве qtbase, так что можете спрашивать в лс - попробую ответить на вопросы.

Вешч №5. Динамика развития проекта

Qt разрабатывается уже много лет, с конца 90-х. За это время его коммерческой версией уже успели наиграться такие компании, как Trolltech и Nokia, а сейчас этим занимается Digia. Но одно можно точно сказать, проект живет и процветает. Еще несколько лет дизайн все писали на виджетах (С++ классы, все до единого основанные на QWidget), а сегодня его может сделать и маленький ребенок. Думаю, не стоит говорить, что параллельно с ним активно развивается мошнейшая вешч - Qt Creator, который сегодня радует не только Qt программистов!

^ классненький Qt Creator, в котором можно творить чудеса и тебе за это ничего не будет .

К сожалению, у меня нету строгих чисел, но говорят, что код каждый день оптимизируется, а codebase тщательно наращивается - добавляются новые фичи и исправляются старые баги (в этом то я успел убедиться уже много раз). Все это очень годно и не может не радовать.

К тому же, сейчас идет активное развитие платформ iOS, Android, Windows Phone , уже сейчас можно собирать под них программы!

Итог

Я думаю вы понимаете, что Qt - это правда круто и после прочтения статьи вы полюбили его так же, как и я.
Спасибо за внимание!

Лекция и Лабораторная работа

По курсу: Операционные системы

На тему: Среда программирования Qt

Выполнили:

Студенты группы А-06-09

Смирнов Андрей

Маругин Михаил

1.Введение

2.История

3.Развитие среды

4.Область применения

5.Общие сведения

6.Компоненты

7.Среда разработки

8.Работа с Qt Creator

9.Примеры

10.Задание на лабораторную работу

Введение

Есть также «привязки» ко многим другим языкам программирования: Python - PyQt, Ruby - QtRuby, Java - Qt Jambi, PHP - PHP-Qt и другие.

Позволяет запускать написанное с его помощью ПО в большинстве современных операционных систем путём простой компиляции программы для каждой ОС без изменения исходного кода. Включает в себя все основные классы, которые могут потребоваться при разработке прикладного программного обеспечения, начиная от элементов графического интерфейса и заканчивая классами для работы с сетью, базами данных и XML. Qt является полностью объектно-ориентированным, легко расширяемым и поддерживающим технику компонентного программирования.

Начиная с версии 4.5 Qt распространяется с различными лицензиями. Это означает, что если вы собираетесь создавать коммерческие приложения, то должны приеобрести коммерческую лицензию Qt; если же создаётся программа с открытым исходным кодом, то можно использовать версию с лицензией GPL.

История

Средства разработки Qt впервые стали известны общественности в мае 1995 года. Первоначально Qt разрабатывалось Хаарвардом Нордом и Айриком Чеймб-Ингом.

В 1991 году Хаарвард начал писать классы, которые фактически образовали Qt, причём проектные решения принимались совместно с Айриком.

В следующем году Айрику пришла идея «сигналов и слотов» - простой, но мощной парадигмы программирования GUI, которая в настоящее время заимствована некоторыми другими инструментами.

К 1993 году Хаарвард и Айрик разработали первое графическое ядро Qt и могли создавать собственные виджеты.

Неинтересные заметки: Буква «Q» была выбрана в качестве префикса классов, поскольку эта буква имела красивое начертание в шрифте Emacs, которым пользовался Хаарвард. Была добавлена буква «t», означающая «toolkit»(инструментарий).

Развитие

В апреле 1995 года - норвежская компания «Metis» заключила с ними контракт на разработку программного обеспечения на основе Qt.

26 мая 1995 года - первая публичная версия Qt. Qt можно было использовать в разработках как Windows, так и Unix, причём программный интерфейс был одинаковый на обеих платформах.



С 1996 по 2001 год – развитие до версии Qt3. Qt теперь работала в системах Windows, Mac Os X, Unix.

Лето 2005 года - выпущена Qt 4.0. Имея около 500 классов и более 9000 функций, Qt 4 оказалась больше и богаче любой предыдущей версии; она была разбита на несколько библиотек, чтобы разработчики могли использовать только нужные им части Qt.

На сегодняшный день версия Qt4.8

Версия Qt 4 представляет собой большой шаг вперёд по сравнению с предыдущими версиями; она содержит полностью новый набор эффективных и простых в применении классов-контейнеров, усовершенствованную функциональность архитекторы модель/представление, быстрый и гибкий фреймфорк графики 2D и мощные классы для просмотра и редактирования текста в кодировке Unicode, не говоря уже о тысячах небольших улучшений по всему спектру классов Qt.

Qt 4 является первой версией Qt, доступной на всех поддерживаемых платформах как для коммерческой разработки, так и для разработки с открытым исходным кодом.

Область применения

Возможность создавать desktop-приложения для Windows, Linux, Mac OS X (как консольные, так и с оконным графическим интерфейсом). В последние несколько лет наблюдается тенденция увеличения количества выпускаемых мобильных устройств. В следствии чего Qt портировали на мобильные платформы: Symbian, Maemo, MeeGo. Также известно об удачном опыте портрования Qt Lighthouse на платформу Android.

Общие сведения

Позволяет запускать написанное с его помощью ПО в большинстве современных операционных систем путём простой компиляции программы для каждой ОС без изменения исходного кода.

Включает в себя все основные классы, которые могут потребоваться при разработке прикладного программного обеспечения, начиная от элементов графического интерфейса и заканчивая классами для работы с сетью, базами данных и XML.

Qt является полностью объектно-ориентированным, легко расширяемым и поддерживающим технику компонентного программирования.

Существуют версии библиотеки для Microsoft Windows, систем класса UNIX с графической подсистемой X11, iOS, Android, Mac OS X, Microsoft Windows CE, QNX, встраиваемых Linux-систем и платформы S60. В данный момент рассматривается возможность внедрения поддержки Qt в Windows Phone. Также идёт портирование на Haiku.

Отличительная особенность Qt от других библиотек - использование Meta Object Compiler (MOC) - предварительной системы обработки исходного кода (в общем-то, Qt - это библиотека не для чистого C++, а для его особого наречия, с которого и «переводит» MOC для последующей компиляции любым стандартным C++ компилятором). MOC позволяет во много раз увеличить мощь библиотек, вводя такие понятия, как слоты и сигналы. Кроме того, это позволяет сделать код более лаконичным. Утилита MOC ищет в заголовочных файлах на C++ описания классов, содержащие макрос Q_OBJECT, и создаёт дополнительный исходный файл на C++, содержащий метаобъектный код.

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

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

В поставке Qt есть «Qt Linguist» - графическая утилита, позволяющая упростить локализацию и перевод программы на многие языки; и «Qt Assistant» - справочная система Qt, упрощающая работу с документацией по библиотеке, а также позволяющая создавать кросс-платформенную справку для разрабатываемого на основе Qt ПО. Начиная с версии 4.5.0 в комплект Qt включена среда разработки «Qt Creator», которая включает в себя редактор кода, справку, графические средства «Qt Designer» и возможность отладки приложений. «Qt Creator» может использовать GCC или Microsoft VC++ в качестве компилятора и GDB в качестве отладчика. Для Windows версий библиотека комплектуется компилятором, заголовочными и объектными файлами MinGW.

Компоненты (выделим парочку)

Библиотека разделена на несколько модулей, для четвёртой версии библиотеки это:

QtCore - классы ядра библиотеки, используемые другими модулями;

QtGui - компоненты графического интерфейса;

QtNetwork - набор классов для сетевого программирования. Поддержка различных высокоуровневых протоколов может меняться от версии к версии. В версии 4.2.x присутствуют классы для работы с протоколами FTP и HTTP. Для работы с протоколами TCP/IP предназначены такие классы, как QTcpServer, QTcpSocket для TCP и QUdpSocket для UDP;

QtOpenGL - набор классов для работы с OpenGL;

QtSql - набор классов для работы с базами данных с использованием языка структурированных запросов SQL. Основные классы данного модуля в версии 4.2.х: QSqlDatabase - класс для предоставления соединения с базой, для работы с какой-нибудь конкретной базой данных требует объект, унаследованный от класса QSqlDriver - абстрактного класса, который реализуется для конкретной базы данных и может требовать для компиляции SDK базы данных. Например, для сборки драйвера под базу данных FireBird/InterBase требует.h файлы и библиотеки статической линковки, входящие в комплект поставки данной БД;

QtScript - классы для работы с Qt Scripts;

QtSvg - классы для отображения и работы с данными Scalable Vector Graphics (SVG);

QtXml - модуль для работы с XML, поддерживается SAX и DOM модели работы;

QtDesigner - классы создания расширений QtDesigner’а для своих собственных виджетов;

QtUiTools - классы для обработки в приложении форм Qt Designer;

QtAssistant - справочная система;

Qt3Support - модуль с классами, необходимыми для совместимости с библиотекой Qt версии 3.х.х;

QtTest - модуль для работы с UNIT тестами;

QtWebKit - модуль WebKit, интегрированный в Qt и доступный через её классы;

QtXmlPatterns - модуль для поддержки XQuery 1.0 и XPath 2.0;

Phonon - модуль для поддержки воспроизведения и записи видео и аудио, как локально, так и с устройств и по сети;

QtCLucene - модуль для поддержки полнотекстового поиска, применяется в новой версии Assistant в Qt 4.4;

ActiveQt - модуль для работы с ActiveX и COM технологиями для Qt-разработчиков под Windows.

QtDeclarative - модуль, предоставляющий декларативный фреймворк для создания динамичных, настраиваемых пользовательских интерфейсов.

Библиотека использует собственный формат проекта, именуемый.pro файлом, в котором собрана информация о том, какие файлы будут скомпилированы, по каким путям искать заголовочные файлы и много другой информации.

Впоследствии при помощи утилиты qmake из них получаются makefile для make-утилиты компилятора. Также есть возможность работы при помощи интеграторов с Microsoft Visual Studio 2003/2005/2008/2010. Совсем недавно стала доступна интеграция в Eclipse для версии библиотеки 4.х.х.

Разработчики на Java могут использовать Qt с помощью фреймворка Qt Jambi от того же производителя (официально с 2009 года Qt Software прекратила разработку этого фреймворка).

«+»

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

Среда разработки

Qt Creator - кроссплатформенная свободная IDE для разработки на С, С++ и QML. Разработана Trolltech (Nokia) для работы с фреймворком Qt. Включает в себя графический интерфейс отладчика и визуальные средства разработки интерфейса как с использованием QtWidgets, так и QML. Поддерживаемые компиляторы: Gcc, Clang, MinGW, MSVC, Linux ICC, GCCE, RVCT, WINSCW.

Основная задача Qt Creator - упростить разработку приложения с помощью фреймворка Qt на разных платформах. Поэтому среди возможностей, присущих любой среде разработки, есть и специфичные, такие как отладка приложений на QML и отображение в отладчике данных из контейнеров Qt, встроенный дизайнер интерфейсов как на QML, так и на QtWidgets.

Работа в Qt Creator

В Qt Creator есть удобный «мастер» для создания новых проектов, форм, файлов с классами и так далее. Хотя вместо создания ui-файла для главного окна можно было бы вставлять в проект какой-нибудь простой код, не касаясь вотчины визуального программирования. После создания или открытия проекта перед нами предстает сама среда разработки. Поначалу она выглядит непривычно. Например, нет знаменитых табов (вкладок с корешками). Вернее, они есть для всего кроме файлов редактора. Сами же файлы доступны из двух списков: файлов проекта (по умолчанию на панели слева) и уже открытых файлов (в верхней строке панели редактора). Почему же принято решение отказаться от вкладок? Думаю, что ради экономии места на экране.

Еще один непривычный момент довольно относителен, поскольку интерфейс «без диалогов» давно взят на вооружение некоторыми другими программами (например, редактором TEA). В Qt Creator для поиска и замены по тексту появляются поля ввода, при наборе текста в которых найденные совпадения сразу подсвечиваются в редакторе. Для поиска дальше есть F3, а для замены - отдельное поле ввода. Рядом расположены и опции. Благодаря всему этому подобные операции проводятся быстро и удобно. То же касается информационных и отладочных панелей: никакой модальности, лишних окон, перекрывающих основное, и прочих прелестей былого подхода к архитектуре интерфейса. Всё в одном главном окне!

В Qt Creator позаботились и о редакторе кода. Подсветкой синтаксиса нынче мало кого можно удивить, поэтому сразу перейдем к другим полезным возможностям. Например, есть «полный парсер кода» - это возможность редактора проверять код на правильность с точки зрения языка программирования. Когда вы набираете код, то еще до компиляции видите, где допустили синтаксическую ошибку. В большинстве случаев срабатывает, хотя бывают и исключения. Замечательно работает автоматическое дополнение: набрали имя экземпляра класса, поставили точку или «->» - и получаете выпадающий список с членами класса. Есть свёртывание блоков кода - так называемый «фолдинг». Впрочем, я считаю, что код более нагляден без него, поэтому никогда такой возможностью не пользуюсь.

Хорошо сделано перемещение по коду - причем без внешнего ctags. Достаточно поставить курсор на имя функции или переменной и нажать F2, после чего редактор переносит в место объявления. Shift-F2 - переключает между объявлением и кодом, а F4 - просто переключает заголовок и cpp-файл. Если поднести указатель мыши к имени вызываемой в коде функции, то появится подсказка по ее параметрам.

Справочная система работает следующим образом. Допустим, у вас в коде где-то есть переменная типа QMenu. Если поставить на нее курсор и нажать F1, возникает справочная панель с описанием класса QMenu. Также в главном окне существует вкладка Help, где доступна вся документации по Qt.

Итак, большую часть времени вы будете проводить на вкладке редактора. Не совсем понятно, для чего в настройках Qt Creator есть целых пять разделов как бы для разных редакторов - по умолчанию, для скриптов, для С++, для проектов и Perforce (коммерческая система контроля над версиями). Настройки редактора С++ - это и есть настройки редактора кода вашей Qt-программы. Замечу, что в самых свежих «снэпшотах» Qt Creator настройки шрифта всё же упорядочены в единственный раздел, чего и следовало ожидать.

Полезно заняться настройкой подсветки и шрифтов, поскольку по умолчанию работать не очень удобно. Во-первых, размер шрифта слишком мелкий, а во-вторых, блоки кода, заключенные в #ifdef / #endif, трактуются парсером как «disabled code» (выражение из настроек Qt Creator) и раскрашиваются серым цветом - разбирать написанное не очень удобно. Если вам не нравится «фолдинг», там же в настройках редактора отключите Display Folding Markers.

На полях редактора можно ставить закладки и точки останова. Сама панель редактора может быть разделена на бесконечное множество вложенных панелей - подобно Konqueror. Таким образом на экране одновременно можно редактировать либо несколько файлов, либо один и тот же документ, но в разных местах. Для этого надо сначала разделить панель редактора (например, через Window - Split Top/Bottom), а затем выбрать пункт меню Window - Duplicate document. Такой подход иногда бывает полезнее, чем утомительные переходы по закладкам.

Архитектура Qt Creator зиждется на плагинах. Редактор - плагин, движок закладок - плагин, панель с файлами проекта - тоже плагин, и так далее. Список установленных плагинов можно посмотреть в меню Help - About Plugins. Вероятно, в будущем можно будет устанавливать дополнительные плагины, но покамест механизма для этого я не обнаружил, равно как и самих дополнительных плагинов. Зато в самих сборках новые плагины появляются с небывалой скоростью. Только за месяц появились модули поддержки Subversion и Git. Qt Creator вообще сейчас присуща скоротечность. Пункты меню Qt Creator от версии к версии переименовываются и переносятся в другие подменю. Не говоря уже о том, что постоянно рождаются дополнительные функции.

Уделим некоторое внимание окну настроек, которых, благо, много. Можно настраивать сочетания клавиш и, более того, импортировать / экспортировать их с помощью внешних файлов. Это удобно для переноса любимых сочетаний клавиш с машины на машину. В состав Qt Creator по умолчанию входят два таких предустановленных файла: для MS Visual C++ и Xcode. Всё, что связано с автоматическим дополнением, отступами, подсветкой синтаксиса и прочим, находится в настройках редактора - Text Editor.

Другое интересное средство в Qt Creator - это Locator (в старых версиях - Quick find). Для того, чтобы переместить в него фокус, достаточно нажать на Ctrl-K. Выглядит как обычная строка поиска, а служит для быстрого поиска чего угодно в чём изволите. Если говорить конкретнее - ищет файлы, в файлах, классы, функции. Поддерживает символы-модификаторы для уточнения задачи поиска. Например, вы хотите найти в документации Qt описание глобального указателя qApp. Что делать? Раньше приходилось открывать документацию через браузер и искать там. Но в Qt Creator, когда всегда под рукой Locator, достаточно набрать в строке поиска? qapp и нажать Enter. Перейти на строку под номером 100? Пожалуйста - набираете номер и снова Enter.

И напоследок, вернемся к взаимодействию с отладчиком GDB. Qt Creator через свой графический интерфейс позволяет отлаживать не только текущий проект, но и любую внешнюю программу - конечно, если она собрана с отладочной информацией. При отладке данные различного рода отображаются в отдельных вкладках: нити, переменные, точки останова и дизассемблер. Особенно наглядно выглядит в отладчике экземпляр QStringList - видны все его элементы. Стандартный вывод самого GDB по умолчанию выключен, равно как и некоторые другие вкладки вроде сведений о содержимом регистров процессора. Если программа по какой-то причине «вылетает», то по данным в отладочной панели сразу видно, в каком именно месте кода произошел сбой.

Пример 1

Наша первая программа будет с графическим интерфейсом пользователя(GUI - Graphical User Interface).

#include

#include

int main(int argc, char *argv)

QApplication app(argc, argv);

QPushButton *newbtn = new QPushButton(QObject::tr("OK"));

QObject::connect(newbtn, SIGNAL(clicked()), &app, SLOT(quit()));

newbtn->resize(180,40);

newbtn->show();

return app.exec();

Первые две строки - определения классов Qt.

Эти классы относится к интерфейсу прикладного программирования (API - Application Programming Interface) библиотеки Qt. В библиотеке есть файлы с такими же названиями, описывающие данный классы.

В строке 6 создается объект QApplication. Данный класс управляет всеми ресурсами приложения. Затем создается объект класса QPushButton(кнопка) с надписью "OK".

Кнопка является виджетом. Строка 8 служит для связывания сигнала clicked() кнопки со слотом quit() объекта QApplication3. В строке 9 мы устанавливаем размер виджета и в строке 10 отображаем его. Строка 11 служит для передачи управления приложением Qt. В этом месте программа переходит в цикл обрабоки пользовательских и системных событий.

Пример 2. Проверка вводимых пользователем данных

Когда пользователю предлагается ввести какие-либо данные в текстовое поле, то довольно часто можно получить что-то абсолютно неожиданное. Пользователь может ввести числа прописью, использовать неверный десятичный разделитель или забыть указать код города в телефонном номере. Таким образом, в большинстве случаев, необходимо проверять правильность(допустимость)1 указанной информации.

Qt содержит класс QValidator, гарантирующий корректность введенных данных. Данных класс не может быть использован напрямую. Для проверки данных придется либо воспользоваться готовыми подклассами QIntValidator, QDoubleValidator, QRegExpValidator, либо написать подкласс самим.

В метод validate(QString & input, int & pos) передается строка для проверки и позиция курсора. Метод может возвращать следующие значения:

QValidator::Invalid - строка недопустима.

QValidator::Acceptable - строка допустима.

QValidator::Intermediate - строка не может быть принята в текущем состоянии, но она может стать допустимой.

Составим программу, которая будет проверять, является ли строка вещественным числом. Воспользуемся готовым классом QDoubleValidator:

MainWindow::MainWindow()

grid = new QGridLayout; doubleedit = new QLineEdit;

lbdouble = new QLabel(tr("Double:"));

lbresult = new QLabel(tr("Result:"));

result = new QLabel;

vld = new QDoubleValidator(-5, 2999, 5, this);

vld->setNotation(QDoubleValidator::ScientificNotation);

doubleedit->setValidator(vld);

grid->addWidget(lbdouble, 0, 0);

grid->addWidget(doubleedit, 0, 1);

grid->addWidget(lbresult, 1, 0); grid->addWidget(result, 1, 1);

resize(160, 120); setLayout(grid); ...

Конструктор класса QDoubleValidator может принимать следущие параметры:

QDoubleValidator::QDoubleValidator (double bottom, double top, int decimals, QObject * parent)

Диапазон вещественных чисел от bottom до top включительно. decimals - количество знаков после десятичного разделителя2.

Используя метод setNotation(Notation) класса QDoubleValidator можно установить допустимость научной нотации:

QDoubleValidator::StandardNotation - стандартная нотация(Например: 1,124 или -2).

QDoubleValidator::ScientificNotation - научная нотация, т.е. число может иметь экспоненциальную часть(Например: 2,7E-3 или 3,3E+2)

Для проверки допустимости введенных данных воспользуемся методом validate():

MainWindow::MainWindow()

QObject::connect(doubleedit, SIGNAL(textChanged (const QString &)), this, SLOT(showresult(const QString &)));

void MainWindow::showresult(const QString &text)

QString numtext = text;

if (vld->validate(numtext, pos) == 0) result->setText(tr("invalid"));

if (vld->validate(numtext, pos) == 1) result->setText(tr("Intermediate"));

if (vld->validate(numtext, pos) == 2) result->setText(tr("Acceptable"));

Код программы

main.cpp

#include

#include "mainwindow.h"

int main(int argv, char **args)

QApplication app(argv, args);

MainWindow window;

return app.exec();

Mainwindiw.h #ifndef MAINWINDOW_H#define MAINWINDOW_H #include class MainWindow: public QWidget{ Q_OBJECT public: MainWindow(); private slots: void showresult(const QString &); private: QGridLayout *grid; QLineEdit *doubleedit; QLabel *lbdouble, *lbresult, *result; QDoubleValidator *vld;}; #endif Mainwindow.cpp #include #include "mainwindow.h" MainWindow::MainWindow(){ grid = new QGridLayout; doubleedit = new QLineEdit; lbdouble = new QLabel(tr("Double:")); lbresult = new QLabel(tr("Result:")); result = new QLabel; vld = new QDoubleValidator(-5, 2999, 5, this); vld->setNotation(QDoubleValidator::ScientificNotation); doubleedit->setValidator(vld); grid->addWidget(lbdouble, 0, 0); grid->addWidget(doubleedit, 0, 1); grid->addWidget(lbresult, 1, 0); grid->addWidget(result, 1, 1); resize(160, 120); setLayout(grid); QObject::connect(doubleedit, SIGNAL(textChanged (const QString &)), this, SLOT(showresult(const QString &)));} void MainWindow::showresult(const QString &text){ int pos = 0; QString numtext = text; if (vld->validate(numtext, pos) == 0) result->setText(tr("invalid")); if (vld->validate(numtext, pos) == 1) result->setText(tr("Intermediate")); if (vld->validate(numtext, pos) == 2) result->setText(tr("Acceptable"));}

Пример 3. 2D графика

С помощью класса QPainter мы можем рисовать на любом объекте, унаследованном от класса QPaintDevice(QWidget, QPrinter, QImage, QGLFramebufferObject и др.). Можно рисовать геометрические фигуры, пиксельные карты, текст. Для начала рассмотрим классы, которые могут быть полезны при работе с QPainter.

Классы QPoint и QPointF служат для задания положения точки в двухмерной системе координат. QPoint - для целых чисел и QPointF - для вещественных. К точкам применимы операции сложения, вычитания, умножения, деления:

QPoint point(5, 5);

QPoint point2(10, 10);

Также точки можно сравнивать между собой и на равенство их координат нулю.

QPoint point(5, 10);

QPoint point2(5, 10);

if (point == point2)

bln = point.isNull();

Классы QSize и QSizeF служат для хранения размера. Кроме методов, аналогичных методам классов QPoint и QPointF, данные классы обладают методом scale(), позволяющим масштабировать графический объект.

Классы QRect и QRectF служат для хранения прямоугольных областей(координат верхнего левого угла и размера):

QRectF(QPointF point, QSizeF size);

Классы QLine и QLineF описывают прямую линию. Классы QPolygon и QPolygonF описывают замкнутую фигуру, образованную прямыми линиями.

C помощью класса QColor можно хранить информацию о цвете. Среда Qt поддерживает 3 цветовые модели: RGB, CMYK и HSV. Для цветовой модели RGB существует структура QRgb. Существует несколько способов задания цвета в объекте класса QColor:

Передача параметров в конструктор

unsigned int red = 50;

unsigned int green = 100;

unsigned int blue = 0;

unsigned int alpha = 128;

QColor mycolor(red, green, blue, alpha);

QRgb rgb1 = (50, 100, 0);

QColor mycolor2(rgb1);

С помощью методов QColor::setRgb(), QColor::setRgba(), QColor::setRgbF(), QColor::setHsv(), QColor::setHsvF(), QColor::setCmyk(), QColor::setCmykF()

mycolor.setHsv(200, 100, 50);

Существует возможность установить цвет в одной модели и считать в другой:

unsigned int h, s, v;

QColor mycolor(100, 100, 100);

mycolor.getHsv(&h, &s, &v);

Вернемся к классу QPainter. Для того, чтобы начать рисовать нам достаточно создать объект класса QPainter и передать ему указатель на объект для рисования:

QPainter pnt(this);

pnt.drawLine(line);

void Wnd::paintEvent(QPaintEvent *event)

QLineF line(10.0, 80.0, 90.0, 20.0);

pnt.begin(this);

pnt.drawLine(line);

Метод QWidget::paintEvent() вызывается для виджетов, которые должны быть перерисованы.

В большинстве случаев рисование производится одним объектом QPainter на нескольких объектах рисования. Для сохранения старых настроек рисования(при переходе на новый объект) можно воспользоваться методами QPainter::save() и QPainter::restore(). QPainter::save() помещает в стек установки, а QPainter::restore() - извлекает.

Для рисования контуров фигуры необходимо передать объекту класса QPainter объект класса QPen(перо) с помощью QPainter::setPen().

С помощью соответствующих методов можно установить стиль пера(цвет, толщину, вид концов линии).

Для заполнения замкнутых контуров используется кисть т.е. объект класса QBrush. По аналогии с классом QPen кисть устанавливается методом QPainter::setBrush(). В него можно передать либо объект QBrush, либо один из предопределенных стилей BrushStyle:

QPainter pnt(this);

pnt.setBrush(QBrush(Qt::blue, Qt::VerPattern)); // голубая кисть с вертикальной штриховкой

Класс QPainter позволяет поворачивать, масштабировать, смещать объекты, делать скос. Для этих операций имеются соответствующие методы: rotate(), scale(), translate(), sheap().

Библиотека Qt поддерживает технику сглаживания(Anti-Aliasing, антиалиасинг):

pnt.setRenderHint(QPainter::antialiasing, true);



Загрузка...