QtУчим Qt вместе. Part 1

Ну попробую и я сделать небольшой цикл статей по QT. Сильно не пинайте потому, что я только начал учить QT :)

Вступление

Qt — кросс-платформенный инструментарий разработки ПО на языке программирования C++. Есть также «привязки» ко многим другим языкам программирования: Python — PyQt, Ruby — QtRuby, Java — Qt Jambi, PHP — PHP-Qt и другие.
Позволяет запускать написанное с его помощью ПО в большинстве современных операционных систем путём простой компиляции программы для каждой ОС без изменения исходного кода. Включает в себя все основные классы, которые могут потребоваться при разработке прикладного программного обеспечения, начиная от элементов графического интерфейса и заканчивая классами для работы с сетью, базами данных и XML. Qt является полностью объектно-ориентированным, легко расширяемым и поддерживающим технику компонентного программирования.
Существуют версии библиотеки для Microsoft Windows, систем класса UNIX с графической подсистемой X11, Mac OS X, Microsoft Windows CE, встраиваемых Linux-систем и платформы S60.

И так поехали...

Идем на сайт и качаем QT SDK для Вашей ОС.

Установка не должна вызвать сложностей. Запускаем QT Creator, создаем новый консольный проект(File->New) назовем например «demo01»(в Windows отказался компилироваться проект когда в путях была кириллица). Правим файлы в проекте:

demo01.pro
QT += gui

TARGET = demo01
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app

SOURCES += main.cpp


main.cpp
#include <QApplication>
#include <QFont>
#include <QPushButton>
#include <QWidget>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QWidget window;
    window.resize(200, 120);

    QPushButton quit("Close Window", &window);
    quit.setFont(QFont("Times", 12, QFont::Bold));
    quit.setGeometry(10, 40, 180, 40);
    QObject::connect(&quit, SIGNAL(clicked()), &app, SLOT(quit()));

    window.show();
    return app.exec();
}


Разбор полета

#include <QApplication>
В графическом приложении Qt обязательно должен быть создан один объект QApplication. QApplication управляет ресурсами приложения, например, задавая тип шрифта или курсора.

#include <QPushButton>
Ну думаю понятно, что этот класс описывает. Конечно же кнопку.

#include <QFont>
Этот класс даст возможность управления шрифтами в приложении.

#include <QWidget>
Класс является базовым классом всех виджетов.

int main(int argc, char *argv[])
 {
Функция main() является точкой входа в вашу программу. В большинстве случаев при написании приложения Qt, только main() нуждается в определённых, связанных с инициализацией действиях до передачи управления библиотеке Qt, которая уже потом, в свою очередь, сообщает программе о действиях пользователя.
Параметр argc — число аргументов командной строки, а argv — массив этих аргументов. Это — стандартная особенность C++.

QApplication app(argc, argv);
Объект app является экземплятором QApplication. В этой строчке мы его создаем. Мы передаём параметры argc и argv в конструктор QApplication, чтобы он мог обработать стандартные аргументы командной строки (такие как -display при работе с X11). Все переданные аргументы, обработанные Qt, будут удалены из argv, argc уменшится в соответствии с этим. Для получения подробной информации о работе с этими параметрами посмотрите документацию на метод QApplication::argv().
Объект QApplication должен быть создан прежде, чем вы начнете работать с графическим интерфейсом пользователя Qt.

QWidget window;
В этой строчке мы просто создаем экземпляр объекта виджета. Класс QWidget является предком всех объектов пользовательского интерфейса. Виджет — это единица (юнит, атом) пользовательского интерфейса: получая данные от клавиатуры, мышки или какого нибудь события, он видоизменяет свое отображение на экране. Виджет может быть связан со своим родительским классом и виджетами, для которых он является родителем.
Виджет, чей родитель не является виджетом (как например в нашем случае), называют окном. Обычно, окна имеют собственную рамку и эмблему для входа через панель задач, обеспечиваемые системой окна. Виджет без родительского окна — всегда независимое окно. Его позицией на экране при старте управляет оконная система.

window.resize(200, 120);
В этой строчке мы устанавливаем размер окна, 200 пикселей ширина и 120 пикселей высота.

QPushButton quit("Close Window", &window);
Ребёнок родился. Этот экземпляр объекта QPushButton создается как потомок виджета (window). Виджет, который является потомком другого виджета, всегда отображается в пределах окна родительского виджета. Его перемещение ограничено границами родительского окна. Если не задать местоположение виджета, то он будет размещен на позиции (0,0).

quit.setFont(QFont("Times", 18, QFont::Bold));
В этой строчке мы выбираем шрифт для надписи, а также определяем его размер и стиль. Мы можем переопределить шрифт по умолчанию для всего приложения Qt, используя метод QApplication::setFont().

quit.setGeometry(10, 40, 180, 40);
В метод QWidget::setGeometry()передается 4 параметра, первый два это координаты X и Y положения верхней левой границы. Это координаты, которые высчитываются относительно родительского виджета. Следующие параметры являются шириной и высотой виджета. Результатом этой команды будет кнопка, которая имеет координаты верхнего левого окна относительного родительского окна (10,40) и иметь ширину 180 и высоту 40.

QObject::connect(&quit, SIGNAL(clicked()), &app, SLOT(quit()));
QObject::connect() является, возможно, самой главной особенностью Qt. Заметьте что метод connect()является статическим методом в классе QObject. Не перепутайте этот метод с функцией connect(), которая входит в библиотеку для работу с сокетами.
Вызов метода connect() создаёт однонаправленную связь двух объектов Qt (которые наследуют QObject или его потомков). Любой Qt-объект может иметь и сигналы (для отправки сообщений), и слоты (для приёма сообщений). Все виджеты являются Qt-объектами, так как они являются наследниками QWidget, который, в свою очередь, наследует QObject.
Здесь сигнал clicked() кнопки quit соединяется со слотом quit() объекта app, в результате при нажатии кнопки приложение завершает работу.
Сигналы испускаются объектом, когда изменяется его внутреннее состояние, и если это может быть интересно его клиентам или владельцу. Только классы, содержащие определения сигналов, и их подклассы могут испускать сигналы.
Слот вызывается как только испускается соединенный с ним сигнал. Слоты — это обычные функции C++, они могут вызываться обычным образом; их единственная особенность — это то, что к ним могут быть присоединены сигналы.

window.show();
Когда родительскому виджету указывают стать видимым, это также влияет и на все его потомственные виджеты (за исключением тех, которые явно будут указаны что они не отображаются, используя метод QWidget::hide()).

return app.exec();
}
В этом месте main() передаёт управление Qt. QCoreApplication::exec() вернёт значение, когда приложение закончит работу. (QCoreApplication является базовым классом для QApplication. Он определяет ядро QApplication, функциональность, не связанную с GUI, и может быть использован при разработке приложений без графического интерфейса пользователя).
В методе QCoreApplication::exec() происходит обработка всех пользовательских и системных событий и передача управления соотвествующим виджетам.

Хеппи Энд

Теперь можно скомпилировать нашу программу и запустить ее (Ctrl+R). Вы должны будете увидеть чтото вроде этого )



Или этого =)

  • +17
  • DmitryG
  • 07 июля 2009, 11:56

Комментарии (12)

сколько частей вы думаете написать?
Если честно еще не знаю. Как получится.
если будет продолжение, то будет весьма интересно. Сам не так давно начал изучать = )
Надо было добавить скринов с разных ОС для эффектности :)
Главным образом из открытых ОС. Open Source же как-никак.
Можно =) но к вечеру еще с Убунты и Вин7
Очень интересно и своевременно! Сам начинаю изучать qt. Надеюсь на продолжение
  • avatar
  • Q2W
  • 07 июля 2009, 22:11
  • #
  • 1
Жаль, что QtJambi закрыли. А то ведь это похоже единственная библиотека для GUI, которую можно использовать в яве и при этом иметь отзывчивый интерфейс.
Правда, я всё равно использую Jambi =)
Насколько я знаю, Jambi не закрыли, а просто передали «на поруки» сообществу.
Так все библеотеки кроме c++ отдали в комьюнити
а как можно вставить в кнопу риссунок и надпись, в QAction?
Порадовало, что Вы начали объяснение не с Hello World, а чего-то посерьезней.
Но слишком мало материала. Надо было сразу написать побольше.
Жду следущих частей)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.