Глава 14
Собственные классы в Qt. Создание
элементов графического интерфейса
14.1
Класс QObject
QObject
является базовым классом для почти всех классов Qt. Исключением
являются только классы, которые должны быть достаточно «лёгкими» (экзем-
пляры которых должны занимать как можно меньше памяти) и классы, объекты
которых должны копироваться (QObject не поддерживает копирования), а также
контейнерные классы. Все виджеты Qt наследуют QObject (класс QWidget явля-
ется потомком QObject). QObject реализует все базовые особенности, которыми
обладают классы Qt:
• мощный механизм взаимодействия между объектами с помощью
сигнально-слотовых соединений;
• иерархические взаимосвязи между объектами, позволяющие объединять их
в объектные деревья;
• управление памятью;
• «умные» указатели, позволяющие отслеживать уничтожение объекта;
• поддержка свойств;
• таймеры;
• обработка событий и фильтры событий;
• метаинформация о типе объекта, его свойства и т. п.
Каждый объект типа QObject обладает метаданными, которые хранятся внут-
ри специального метаобъекта. Этот метаобъект создаётся для каждого потомка
QObject
и сохраняет различную информацию об объекте (так называемые мета-
данные). Среди доступных для программиста метаданных есть:
• имя класса (метод const chat *Qobject::className());
• наследование (метод bool QObject::inherits(const char *className));
• информация о свойствах;
14.1. Класс QObject
375
• информация о сигналах и слотах;
• общая информация о классе (QОbject::classInfo).
Метаданные собираются во время компиляции (предварительной обработки про-
екта с помощью qmake) метаобъектным компилятором moc, который анализирует
содержание заголовочных файлов программы. Эти метаданные позволяют полу-
чить информацию о любом потомке QObject. Эта информация может быть по-
лезна как для отладки программы, так и для создания различных механизмов
взаимодействия между объектами в программе.
При разработке с использованием Qt часто возникает необходимость насле-
довать класс QObject непосредственно или его потомка. Объекты, которые на-
следуют QObject:
• имеют имя (QObject :: objectName ()), которое используется в Qt для
реализации различных возможностей (стили, QML и т.д.);
• могут занимать место в иерархии других объектов QObject;
• могут иметь сигнально-слотовые соединения с другими объектами QObject.
Рассмотрим создание собственного класса на примере создания виждета, ко-
торый можно будет многократно использовать в разных программах. Разрабо-
таем поле ввода с пиктограммой, которая может реагировать на действия поль-
зователя. Такая пиктограмма:
• может быть статически изображена в поле ввода (например, для обозначе-
ния обязательных полей в форме ввода данных пользователем);
• обозначать пустое поле или поле с введёнными данными (например, для
обозначения некорректно введённых данных);
• выполнять заранее заданное действие после нажатия (например, для от-
крытия диалога выбора файла для поля ввода пути к файлу).
Создадим новый проект и добавим к нему новый класс, который будет насле-
довать от QLineEdit (создание новых классов с использованием мастера описано
в разделе 13.1). Назовём новый класс IconizedLineEdit. После создания нового
класса откроем файл описания (IconizedLineEdit.h).
Для того, чтобы корректно наследовать класс от QObject необходимо выпол-
нить несколько условий:
• во-первых, QObject (или потомок QObject, от которого наследуют) должен
стоять первым в списке классов, от которых наследуют;
• во-вторых, перед объявлением интерфейса класса сразу после фигурной
скобки в частной секции размещают макрос Q_OBJECT.
Созданный класс выполняет эти условия (наследует от QLineEdit, который на-
следует от QWidget, а тот в свою очередь от QObject и содержит макрос Q_OBJECT
в частной секции класса).
© 2015 Алексеев Е. Р., Злобин Г. Г., Костюк Д. А., Чеснокова О. В., Чмыхало А. С.
376
Do'stlaringiz bilan baham: |