После суток жизни поста я начал замечать утечку кармы, так что заранее прошу прощение за возможно недопустимый стиль изложения в статье и субъективизм
Привет, Хабрахабр!
Последнее время я не мог не обратить внимание на популярность темы 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 – это не только элементы графического интерфейса. Этот фреймворк представляет собой взаимосвязанную систему. Родственность Qt-объектов осуществляется через наследование класса QObject. А связи между ними через сигнально-слотовую систему.В этой статье будут описаны основные классы и полезные особенности этой библиотеки. QObject Это базовый класс для всех объектов Qt. Его наследует любой класс использующий сигналы и слоты. Он обеспечивает возможность соединения объектов друг с другом. А также предоставляет к этому полезную функциональность. Во введение этого …
Первая программа на Qt:
Первая программа на Qt: Qt – это мощный инструментарий, имеющий множество способов для воплощения задумок программиста в жизнь. Давайте начнём его освоение с самой первой программы Итак, у вас под рукой имеется среда разработки QtCreator с подключенным к ней компилятором(например MinGW). В среде разработки выбираем Другой проект-> Проект с поддиректориями. Название: cppstudio. Здесь для удобства мы будем хранить все приложения взятые с сайта. Создадим здесь под проект QWidget с название lesson_1 и удаляем в нём файлы mainwindows.h, mainwindows.cpp, …
Введение — графическая библиотека Qt
Qt – свободная широко распространённая графическая библиотека C++. Она содержит множество компонентов для поддержки не только графики, но и сети, базы данных и т.д. Общая информация: С начала использования программист получает взаимосвязанный фреймворк. Это даёт возможность при написании большей части программы использовать только встроенные классы и практически полностью отказаться от связи с определённой ОС. Такой подход реализует независимость и свободу разработчика. (Отсутствует необходимость переписывать программу под несколько операционных систем. Алгоритм для Windows может, скомпилирован в …
После суток жизни поста я начал замечать утечку кармы, так что заранее прошу прощение за возможно недопустимый стиль изложения в статье и субъективизм
Привет, Хабрахабр!
Последнее время я не мог не обратить внимание на популярность темы 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 - это правда круто и после прочтения статьи вы полюбили его так же, как и я.Спасибо за внимание!
Естественно, из меня писатель как из бутылки молоток, так что уж простите, если увидети выдержки из какой-либо знакомой вам доселе не обессудте:-)))
И огромное спасибо 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), |
После чего при каждом "испускании" сигнала 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 |
В командной строке наберем:
qmake simple.pro |
И теперь черед утилиты make: приложение готово Запускаем, наблюдаем окошко с кнопочкой.