Технология ООП
Санкт-Петербургский государственный политехнический университет
25 октября 2011
Технология ООП
Qt
Qt —- кросс-платформенный инструментарий разработки ПО
на языке программирования C++.
Технология ООП
Лицензии
Qt Commercial
GNU GPL
GNU LGPL
Технология ООП
Преимущества перед другими фреймворками
Объектно-ориентированная архитектура библиотеки.
Открытость.
Кроссплатформенность.
Отличная документация.
Обилие примеров.
Множество готовых классов и методов.
Технология ООП
Компоненты
QtCore
QtGui
QtWidgets
QtNetwork
QtOpenGL
QtSql
Технология ООП
Дистрибуция
Исходный код:
git://[Link]/qt/[Link]
[Link]
qt5/[Link]
[Link]
Windows, MacOS X:
Online-установщик
Offline-установщик
([Link]
[Link]/official_releases/qt/5.12/5.12.0/
[Link])
Offline-установщик ([Link]
sites/[Link]/official_releases/
qt/5.12/5.12.0/[Link])
Перед запуском offline-установщика необходимо
отключить сеть интернет.
Технология ООП
Дистрибуция Windows
Версия 5.12 для Windows:
[Link]
[Link]/official_releases/qt/5.12/5.12.0/
[Link]
[Link]
/g/personal/glazunov_vv_spbstu_ru/
EZP8HI7NDlRJuYPZxPmUuaQBBgyBqNRtcgAG3jo5C12lIg?e=
c2PovN
В установщике можно выбрать сборку либо для разработки в
Visual Studio (MSVC 2017), либо для разработки в Qt creator
(MinGW). При выборе MinGW — не забудьте поставить
компилятор MinGW 7.3.0. При разработке в Visual Studio, через
управления расширениями необходимо установить «Qt Visual
Studio Tools», где в настройках прописать путь к файлу
[Link].
Технология ООП
Дистрибуция другие ОС
Ссылки на дистрибутив для MacOSX (Qt creator):
[Link]
[Link]/official_releases/qt/5.12/5.12.0/
[Link]
[Link]
/g/personal/glazunov_vv_spbstu_ru/
EcSSpwlraCNPvlP0O1QWCrIBg2jhEoE_XiOvgJI-AKTpJA?e=
GsCnF9
В Linux пакет называется в зависимости от дистрибутива,
например, в Debian/Ubuntu — это qt5-default или qt6-base-dev.
Технология ООП
Компиляция
Получить исходный код или разархивировать
Start > Programs > Visual Studio 2019 > Visual Studio
Command Prompt.
cd /d C:\Qt\version
configure -debug-and-release -opensource
nmake
Qt > Qt Options > Qt Versions > Add
Технология ООП
Ускорение компиляции
Download jom [Link]
Extract to C:\jom
Вместо nmake используйте C:\jom\[Link] -j 4 , где 4 —
число ядер процессора.
Технология ООП
Документация
Qt Assistant
частично-переведенная документация
[Link]
examples && demos
Технология ООП
Пример
Сборка приложений:
qmake -project
qmake
nmake
Или для Visual Studio:
qmake -project
qmake -tp vc
Открыть получившийся .vcproj в VS.
Технология ООП
Пример
#i n c l u d e <Q A p p l i c a t i o n >
#i n c l u d e <QLabel>
i n t main ( i n t a r g c , char ∗∗ a r g v )
{
Q A p p l i c a t i o n app ( a r g c , a r g v ) ;
QLabel ∗ l a b e l = new QLabel ( " H e l l o ␣World ! " ) ;
l a b e l −>show ( ) ;
r e t u r n app . e x e c ( ) ;
}
Технология ООП
Форматирование HTML
QLabel ∗ l a b e l = new QLabel ( "<h2><i >Hello </i
>␣<f o n t ␣ c o l o r=red>World!</font></h2>" ) ;
Технология ООП
Сигналы и слоты
#i n c l u d e <Q A p p l i c a t i o n >
#i n c l u d e <QPushButton>
i n t main ( i n t a r g c , char ∗∗ a r g v )
{
Q A p p l i c a t i o n app ( a r g c , a r g v ) ;
QPushButton ∗ b u t t o n = new QPushButton ( " Quit " ) ;
QObject : : c o n n e c t ( b u t t o n , SIGNAL ( c l i c k e d ( ) ) ,
&app , SLOT( q u i t ( ) ) ) ;
b u t t o n −>show ( ) ;
r e t u r n app . e x e c ( ) ;
}
Технология ООП
Механизм сигналов и слотов
Сигналы и слоты — это фундаментальный механизм Qt,
позволяющий связывать объекты друг с другом. Cвязанным
объектам нет необходимости что-либо «знать» друг о друге.
Сигналы и слоты гораздо удобнее механизма функций
обратного вызова (callbacks) и четко вписываются в концепцию
ООП.
Технология ООП
Механизм сигналов и слотов
Для использования этого механизма объявление класса
должно содержать специальный макрос Q_OBJECT на
следующей строке после ключевого слова class:
c l a s s MyClass {
Q_OBJECT
public :
...
};
После макроса Q_OBJECT не нужно ставить точку с запятой.
Перед выполнением компиляции, Meta Object Compiler (MOC)
анализирует такие классы и автоматически внедряет в них всю
необходимую информацию.
Технология ООП
Сигналы
Сигнал может быть определен следующим образом:
c l a s s MyClass : p u b l i c QObject {
Q_OBJECT
public :
...
signals :
void mySignal ( ) ;
};
Технология ООП
Сигналы
Для того чтобы инициировать сигнал (выслать сигнал) нужно
ипользовать ключевое слово emit.
Сигналы могут использовать параметры для передачи
дополнительной информации.
v o i d MyClass : : s e n d M y S i g n a l ( )
{
emit mySignal () ;
}
Технология ООП
Слоты
Слоты практически идентичны обычным членам-методам
C++, при их объявлении можно использовать стандартные
спецификаторы доступа public, protected или private.
c l a s s MyClass : p u b l i c QObject {
Q_OBJECT
public s l o t s :
v o i d mySlot ( )
{
...
}
};
Технология ООП
Соединение сигналов и слотов
Для соединения сигналов и слотов можно использовать
статический метод connect, определенный в классе QObject.
Один сигнал может быть соединен со многими слотами, а так
же множество сигналов могут быть соединены с единственным
слотом.
В общем виде соединение выглядит следующим образом:
c o n n e c t ( s e n d e r , SIGNAL ( s i g n a l ) , r e c e i v e r , SLOT( s l o t
));
c o n n e c t ( s e n d e r , &S e n d e r : : s i g n a l M e t h o d , receiver , &
Receiver : : slotMethod ) ;
sender и receiver — это указатели на QObject.
signal и slot — сигнатуры сигнала и слота.
Sender и Receiver классы в которых реализованы сигнал и слот
с одинаковой сигнатурой.
Технология ООП
Соединение сигналов и слотов
Пример соединения:
QObject : : c o n n e c t ( s p i n B o x , SIGNAL ( v a l u e C h a n g e d ( i n t ) )
, s l i d e r , SLOT( s e t V a l u e ( i n t ) ) ) ;
QObject : : c o n n e c t ( s p i n B o x , &QSpinBox : : v a l u e C h a n g e d ,
s l i d e r , &Q S l i d e r : : s e t V a l u e ) ;
Технология ООП
Разъединение сигналов и слотов
Метод disconnect можно использовать для того, чтобы удалить
соединение между сигналом и слотом.
d i s c o n n e c t ( s e n d e r 0 , SIGNAL ( o v e r f l o w ( ) ) , r e c e i v e r 1 ,
SLOT( h a n d l e M a t h E r r o r ( ) ) ) ;
На практике прямой вызов disconnect используется редко, так
как Qt автоматически удаляет все соединения при удалении
объектов.
Технология ООП
Сигналы и слоты
#i n c l u d e <Q A p p l i c a t i o n >
#i n c l u d e <QHBoxLayout>
#i n c l u d e <Q S l i d e r >
#i n c l u d e <QSpinbox>
i n t main ( i n t a r g c , char ∗∗ a r g v )
{
Q A p p l i c a t i o n app ( a r g c , a r g v ) ;
QWidget ∗ window = new QWidget ;
window−>s e t W i n d o w T i t l e ( "Age : ␣" ) ;
QSpinBox ∗ s p i n B o x = new QSpinBox ;
Q S l i d e r ∗ s l i d e r = new Q S l i d e r ( Qt : : H o r i z o n t a l ) ;
s p i n B o x −>s e t R a n g e ( 0 , 1 3 0 ) ;
s l i d e r −>s e t R a n g e ( 0 , 1 3 0 ) ;
QObject : : c o n n e c t ( s p i n B o x , SIGNAL ( v a l u e C h a n g e d ( i n t ) )
,
s l i d e r , SLOT( s e t V a l u e ( i n t ) ) ) ;
Технология ООП
Сигналы и слоты
QObject : : c o n n e c t ( s l i d e r , SIGNAL ( v a l u e C h a n g e d ( i n t ) ) ,
s p i n B o x , SLOT( s e t V a l u e ( i n t ) ) ) ;
s p i n B o x −>s e t V a l u e ( 3 5 ) ;
QHBoxLayout ∗ l a y o u t = new QHBoxLayout ;
l a y o u t −>addWidget ( s p i n B o x ) ;
l a y o u t −>addWidget ( s l i d e r ) ;
window−>s e t L a y o u t ( l a y o u t ) ;
window−>show ( ) ;
r e t u r n app . e x e c ( ) ;
}
Технология ООП
Базовый класс QObject
Фундамент Qt — это объектно-ориентированная модель.
Абсолютное большинство классов - это наследники QObject.
Данный базовый класс содержит поддержку основополагающих
механизмов, которые активно используются потомками:
сигналы и слоты
метаинформация
иерархии объектов
события, фильтры событий
свойства
приведение типов
таймеры
Технология ООП
Базовый класс QObject
QObject в качестве предка при организации множественного
наследования предполагает два ограничения:
В перечне предков QObject (или его потомок) должен
быть объявлен первым.
Только один из предков может быть наследником QObject.
Объекты класса QObject (или его потомков) нельзя
непосредственно копировать или передавать как значения так
как это противоречит многим ключевых особенностям, таким
как иерархические структуры, привязки сигналов/слотов.
Конструктор копирования и оператор присваивания QObject
объявлены пустыми с помощью макроса Q_DISABLE_COPY
Технология ООП
Метаинформация в классах Qt
Метаинформация содержит:
данные о классе
информацию о наследовании
информацию о слотах/сигналах
Для хранения метаинформации используется класс
QMetaObject, объектом которого владеет QObject.
Технология ООП
Метаинформация в классах Qt
Получить указатель на QMetaObject можно с помощью метода
metaObject():
// o b j − объект к л а с с а потомка QObject
i f ( o b j −>m e t a O b j e c t ( )−>c l a s s N a m e ( ) == Q S t r i n g ( "
FirstClass ") )
{
// o b j я в л я ет с я объектом к л а с с а F i r s t C l a s s
...
}
Технология ООП
Метаинформация в классах Qt
Для проверки информации о наследовании можно
воспользоваться методом QObject::inherits():
// o b j − объект к л а с с а потомка QObject
i f ( o b j −> i n h e r i t s ( "QAbstractButton" ) )
{
QAbstractButton ∗ button = static_cast<
Q A b s t r a c t B u t t o n ∗>( o b j ) ;
...
}
Технология ООП
Метаинформация в классах Qt
Тоже самое можно сделать воспользовавшись
qobject_cast<T>:
QAbstractButton ∗ button = qobject_cast <
Q A b s t r a c t B u t t o n ∗>( o b j ) ;
i f ( button )
{
...
}
qobject_cast — является аналогом dynamic_cast, но не требует
включения RTTI и для наследников QObject класса работает
намного быстрее.
Технология ООП
Иерархии объектов в Qt
Для построения иерархий необходимо использовать классы,
рожденные от QObject. Объекты классов должны создаваться
динамически.
Класс QObject содержит реализацию всех необходимых
методов для организации иерархий объектов. Конструктор
QObject выглядит следующим образом:
QObject ( QObject ∗ p a r e n t =0) ;
Технология ООП
Иерархии объектов в Qt
Одно из основных достоинств иерархий объектов — это
автоматическое удаление всех дочерних объектов при удалении
корневого объекта. Разработчику достаточно удалить только те
объекты, которые являются вершинами.
Технология ООП
Иерархии объектов в Qt
Методы QObject для работы с иерархиями:
setParent() — позволяет задать нового родителя.
parent() — возвращает указатель на текущего родителя.
children() — возвращает указатель на список дочерних
объектов.
findChildren() — позволяет искать дочерние объекты по
имени (поддерживаются регулярные выражения).
dumpObjectInfo() — отображает отладочную информацию
об иерархии.
setObjectName()/objectName() — задать/получить имя
объекта.
Технология ООП
Обработка событий в классе QObject
События используются для оповещения объектов о
возникновении/изменении каких-либо ситуаций. Основными
источниками событий являются элементы пользовательского
интерфейса, кроме того существуют события, генерируемые
системными объектами (например, таймерами). В общем
случае, сразу после возникновения, событие помещается в
очередь для дальнейшей обработки.
Технология ООП
Таймеры класса QObject
Класс QObject содержит встроенные таймеры, которые
позволяют организовать периодическое повторение
определенных действий. Для использования таймеров QObject
содержит следующие методы:
int startTimer( int interval )
virtual void timerEvent( QTimerEvent* event )
void killTimer( int id )
Технология ООП
Таймеры класса QObject
Объект QObject позволяет создавать множество таймеров. При
реализации потомка таймеры могут быть запущены
следующим образом:
v o i d MyObject : : b e g i n P o l l i n g ( )
{
t i m e r 1 = s t a r t T i m e r ( 1000 ) ; // каждую с е к у н д у
t i m e r 2 = s t a r t T i m e r ( 60000 ) ; // каждую минуту
}
Технология ООП
Таймеры класса QObject
При этом виртуальный метод timerEvent() должен действовать
в зависимости от идентификатора вызывающего таймера:
v o i d MyObject : : t i m e r E v e n t ( QTimerEvent ∗ e v e n t )
{
s w i t c h ( e v e n t −>t i m e r I d ( ) )
{
case t i m e r 1 :
// ежесекундное д е й с т в и е
break ;
case t i m e r 2 :
// ежеминутное д е й с т в и е
break ;
default :
break ;
}
}
Технология ООП