Описание класса tobject


Содержание

Классы и объекты

22.01.2011, 09:10

Классы и объекты
Добрый день всем.Хотел узнать кое что,надеюсь вопрос будет соответствовать название темы:) На.

Классы и объекты
Создать класс Date для работы с датами в формате «год.месяц.день». Дата представляется структурой с.

Классы и объекты
Не могу разобраться с классами для курсовой. Нужно сделать мобов. Каждый должен иметь timer и.

Объекты и классы
Всем привет! Может кто-то нормальным русским языком объяснить, что такое классы и объекты, как.

Объекты и классы
Доброго всем! Возникла проблема с задачей. помогите пожалуйста разобраться. Нужно нарисовать.

22.01.2011, 09:16 2 18.04.2011, 23:58 3

Может вам это поможет.

Тема 2.2.41. Классы и объекты

1. Основные понятия
2. Составляющие класса
3. Объявление класса

1. Основные понятия

Классами в Object Pascal называются специальные типы, которые содержат поля, методы и свойства. Как и любой другой тип, класс служит лишь образцом для создания конкретных экземпляров реализации, которые называются объектами. Понятие класса разработчиками Object Pascal было заимствованно из языка Си++.
Всякий экземпляр класса называется объектом. По структуре и способу доступа класс в некоторой степени напоминает запись.
Важным отличием классов от других типов является то, что объекты класса всегда распределяются в куче, поэтому объект-переменная фактически представляет собой лишь указатель на динамическую область памяти. Однако в отличие от других указателей при ссылке на содержимое объекта запрещается использовать символ «^» за именем объекта:
Пример описания:

Таким образом, по умолчанию непосредственным родилем любого пользовательского класса считается класс TObject.
Принцип наследования приводит к созданию ветвящегося дерева классов, постепенно разрастающегося при перемещении от TObject к его потомкам. Каждый потомок дополняет возможности своего родителя новыми и передает их своим потомкам.
Полиморфизм – это свойство классов решать схожие по смыслу проблемы разными способами. В рамках Object Pascal поведенческие свойства класса определяются набором входящих в него методов. Изменяя алгоритм того или иного метода в потомках класса, программист может придавать этим потомкам отсутствующие у родителя специфические свойства. Для изменения метода необходимо перекрыть его в потомке, т. е. объявить в потомке одноименный метод и реализовать в нем нужные действия. В результате в объекте-родителе и объекте-потомке будут действовать два одноименных метода, имеющие разную алгоритмическую основу и, следовательно, придающие объектам разные свойства. Это и называется полиморфизмом объектов.
В Object Pascal полиморфизм достигается не только описанным выше механизмом наследования и перекрытия методов родителя, но и их виртуализацией, позволяющей родительским методам обращаться к методам своих потомков.

2. Составляющие класса

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

В контексте программы свойство ведет себя как обычное поле. Разница между полем и свойством заключается в том, что при обращении к свойству автоматически подключается соответствующий метод: при передачи свойству нового значения – метод, описанный после write; если же свойство передает свое значение – метод read. Если нет необходимости в специальных действиях при чтении или записи свойства, вместо имени соответствующего метода можно указывать имя поля.Если необходимо, чтобы поле было доступно только для чтения или только для записи, следует опустить соответственно часть write или read. Вообще говоря, свойство может и не связываться с полем. Фактически оно описывает один или два метода, кото рые осуществляют некоторые действия над данными того же типа, что и свойство.

3. Объявление класса

Любой вновь создаваемый класс может содержать секции (разделы), определяемые зарезервированными словами published (декларированные), private (личные), protected (защищенные), public (доступные) и automated (автоматизированные). Внутри каждой секции вначале определяются поля, а затем – методы и свойства.
Секции определяют области видимости элементов описания класса. Секция public не накладывает ограничений на область видимости перечисляемых в ней полей, методов и свойств – их можно вызывать в любом другом модуле программы. Секция published также не ограничивает область видимости, однако в ней перечисля ются свойства, которые должны быть доступны не только на этапе исполнения, но и на этапе конструирования программы (т. е. в окне Инспектора Объектов). Секция published используется только при разработке нестандартных компонентов. Среда Delphi помещает описания компонентов, вставленных в форму, в специальную секцию без названия, которая располагается сразу за заголовком класса и продолжается до первой объявленной секции. Эта секция – published. В нее не следует помещать собственные элементы описания класса или удалять из нее элементы, вставленные средой. Секция private сужает область видимости до минимума: личные элементы описания доступны только внутри методов данного класса и подпрограммах, находящихся в том же модуле, где описан класс. Элемент, объявленный в секции private, становится недоступным даже ближайшим потомкам класса, если они размещаются в других модулях. Секция protected доступна только методам самого класса, а также любым его потомкам независимо от того, находятся ли они в том же модуле или нет. Наконец, секция automated используется только для объявления свойств и методов, которые будут добавлены к так называемому интерфейсу OLE-объектов Автоматизации; область видимости членов этой секции не ограничена.
В Object Pascal разрешается сколько угодно раз объявлять любую секцию, причем порядок следования секций не имеет значения. Любая секция может быть пустой.
Класс может объявляться только в интерфейсной области модуля или в самом начале области реализации. Нельзя определять классы в разделе описаний подпрограмм.

Класс TObject

Delphi , Компоненты и Классы , Классы

Класс TObject

Класс TObject является родоначальником всей иерархии использующихся в Delphi классов VCL. Он реализует функции, которые обязательно будет выполнять любой объект, который может быть создан в среде разработки. Учитывая гигантское разнообразие возможных областей применения объектов в процессе создания приложений, можно сказать, что круг общих для всех классов операций весьма невелик.

В первую очередь — это создание экземпляра объекта и его уничтожение. Любой объект выполняет эти две операции в обязательном порядке. Процесс создания объекта включает выделение области адресного пространства, установку указателя на экземпляр объекта, задание начальных значений свойств и выполнение установочных действий, связанных с назначением объекта. В общем случае две последние операции могут не выполняться.

Указатель на экземпляр объекта передается в переменную объектного типа, которая в дальнейшем будет идентифицировать объект в программном коде приложения. В приведенном выше фрагменте кода переменная объектного типа someList объявлена как экземпляр типа TStrings. При создании экземпляра этого типа конструктор Create возвращает в переменную SomeList указатель на выделенную для нового объекта область памяти. Для этого применяется метод Newinstance, который вызывается в конструкторе автоматически:

class function Newinstance: TObject; virtual;

Объект класса TObject обеспечивает выполнение этого процесса для любого порожденного от него объекта. А уже внутри конструктора, который унаследован от класса TObject, можно предусмотреть инициализацию переменных и выполнение дополнительных операций. Объявление конструктора выглядит следующим образом:

В конструкторах потомков это объявление может перекрываться, но при необходимости вызвать конструктор предка используется оператор inherited:

Для уничтожения экземпляра объекта в классе TObject предназначены методы Destroy и Free:

destructor Destroy; virtual;

Как видно из объявления, настоящим деструктором является метод Destroy. Он обеспечивает освобождение всех занимаемых экземпляром объекта ресурсов. Обычно при создании новых классов деструктор всегда перекрывается для того, чтобы корректно завершить работу с данными.

Примечание

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

При уничтожении объектов рекомендуется вместо деструктора использовать метод Free, который просто вызывает деструктор, но перед этим проверяет, чтобы указатель на экземпляр объекта был не пустым (не был равен Nil). Это позволяет избежать серьезных ошибок.

Если объект является владельцем других объектов (например, форма владеет всеми размещенными на ней компонентами), то его метод Free автоматически вызовет эти же методы для всех объектов. Поэтому при закрытии формы разработчик избавлен от необходимости заботиться об уничтожении всех компонентов.

Для освобождения занимаемой объектом памяти деструктор автоматически Вызывает метод Freelnstance:

procedure Freelnstance; virtual;

Каждый объект должен содержать некоторую информацию о себе, которая используется приложением и средой разработки. Поэтому класс TObject содержит ряд методов, обеспечивающих представление этой информации в потомках.

class function Classlnfo: Pointer;

возвращает указатель на таблицу информации времени выполнения (RTTI). Эта информация используется в среде разработки и в приложении.

class function ClassName: ShortString;

возвращает имя типа объекта, которое может быть использовано для идентификации. Например, один метод-обработчик щелчка на кнопке может работать с несколькими типами компонентов кнопок:

procedure TForml.BitBtnlClick(Sender: TObject);

if Sender is TBitBtn then TBitBtn(Sender).Enabled := False;

if Sender is TSpeedButton then TSpeedButton(Sender).Down := True;

class function ClassNamels(const Name: string): Boolean;

позволяет определить, является ли данный объект того типа, имя которого передано в параметре Name. В случае положительного ответа функция возвращает True.

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

procedure Dispatch(var Message); virtual;

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

Класс TObject имеет предопределенный обработчик событий:

procedure DefaultHandler(var Message); virtual;

Кроме рассмотренных здесь методов, класс TObject имеет еще несколько методов, которые в основном применяются для взаимодействия объекта со средой разработки.

В целом класс TObject может служить для создания на его основе некоторых простых классов для использования в приложениях.

Статья Класс TObject раздела Компоненты и Классы Классы может быть полезна для разработчиков на Delphi и FreePascal.

Комментарии и вопросы

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

Описание Класса QObject
[модуль QtCore]

Класс QObject является базовым классом для всех объектов Qt. Далее.

Обратите внимание: все функции данного класса не являются потокобезопасными за исключением connect(), connect(), disconnect() и disconnect().

Свойства

Открытые Функции

Открытые Слоты

Защищенные Функции

Макросы

Подробное Описание

Класс QObject является базовым классом для всех объектов Qt.

QObject — это сердцевина модели объектов Qt. Главная особенность этой модели — это очень мощный механизм для связи объектов, навываемый сигналами и слотами. Вы можете установить связь сигнала со слотом с помощью connect() и разорвать такую связь с помощью disconnect(). Во избежание возникновения бесконечных цепочек вызовов можно вызвать blockSignals(). Защищенные функции connectNotify() и disconnectNotify() позволяют отследить установленные соединения.

QObject поддерживают информацию о дереве дочерних объектов. Когда Вы создаете QObject в качестве родителя другого объекта, то объект автоматически добавит себя в список дочерних объектов children(). Родитель принимает в собственность свои дочерние объекты, т.е. дочерние объекты будут автоматически удалены в деструкторе объекта-родителя. Вы можете найти дочерний объект по имени и типу используя findChild() или findChildren().

Каждый объект знает свой objectName(), а имя его класса можно получить с помощью metaObject() (см. QMetaObject::className()). Вы можете определить является ли класс наследником другого класса в иерархии наследования QObject с помощью функции inherits().

Когда объект разрушается, он генерирует сигнал destroyed(). Вы можете перехватить этот сигнал и таким образом избежать повисших ссылок на QObjects. Класс QPointer предоставляет удобную реализацию этой возможности.

QObject могут получать события от других объектов через event() и фильтр событий. Для получения более подробной информации смотрите installEventFilter() и eventFilter(). Для удобства можно переопределить childEvent() позволяющую перехватывать события от дочерних объектов. События ставятся в потоки, в которых объект был создан; для более детальной информации смотрите Поддержка Потоков в Qt и thread().

QObject осуществляет поддержку таймера Qt; для получения информации о высокоуровневой поддержке таймера смотрите QTimer.

Обратите внимание, что макрос Q_OBJECT обязателен для любого объекта, поддерживающего сигналы, слоты и свойства. Вы также должны управлять Meta Object Compiler (MOC) в исходном файле. Мы настоянельно рекомендуем использовать этот макрос во всех классах наследующих QObject независимо от того, действительно ли они используют сигналы, слоты и свойства, так как в противном случае некоторые функции могут вести себя неправильно.

Все виджеты Qt наследуют QObject. С помощью функции isWidgetType() можно узнать, дейтвительлно ли объект является виджетом. Это работает намного быстрее, чем qobject_cast (obj) или obj->inherits(«QWidget»).

Некоторые функции QObject, такие как children(), возвращают QObjectList. QObjectList — переименование типа для QList .

Описание Свойств

objectName : QString

Данное свойство содержит имя объекта.

Вы можете найти объект по имени (и типу) использовав findChild(). Вы можете получить набор объектов использовав findChildren().

Описание Функций-Членов

QObject::QObject ( QObject * parent = 0 )

Создает объект с объектом-родителем parent.

Родитель объекта может быть доступен, как владелец объекта. Например, dialog box — родитель по отношению к кнопкам OK и Cancel которые он содержит.

Все дочерние объекты разрушаются в деструкторе объекта-родителя.

Установка parent в 0 создает объект без родителя. Если объект — это виджет, он будет окном верхнего уровня.

QObject::

Destroys the object, deleting all its child objects.

Все связи сигналов объекта автоматически разрываются.

Предупреждение: Все дочерние объекты будут уничтожены. Если какие либо из этих объектов глобальный или содержится в стеке, рано или поздно Ваша программа потерпит крах. Мы не рекомендуем держать ссылки на дочерние объекты снаружи родителя. Если Вы выполняете деструктор, то сигнал destroyed() дает возможность обнаружить момент разрушения объекта.

Предупреждение: Удаление QObject ожидающего событий может привести к краху. Вы не должны удалять QObject напрямую, если он расположен в потоке, отличном от выполняющегося в данный момент. Используйте вместо этого метод deleteLater() который заставляет уничножить объект после того, как все ожидаемые объектом события будут ему предоставлены.

bool QObject::blockSignals ( bool block )

Блокирует сигналы если block равен true или разблокирует если block равен false.

Если сигналы разблокированы, то они уходят в никуда. Обратите внимение, что сигнал destroyed() будет испускаться даже у заблокированного объекта.

void QObject::childEvent ( QChildEvent * event ) [virtual protected]

Этот перегружаемый перехватчик событий позволяет перехватывать события дочерних объектов. Событие передают через параметр event.

События QEvent::ChildAdded и QEvent::ChildRemoved посылаются объектам, когда добавляются или удалятся дочерние объекты. В обоих случаях следует полагаться на дочерние объекты являющиеся потомками QObject или если isWidgetType() возвращает истину или если объект является QWidget. (Это потому, что ChildAdded может быть инициирован когда дочерний объект еще не до конца построен, а ChildRemoved инициируется когда объект может быть уже разрушен).

Событие QEvent::ChildPolished посылается виджету когда дочерний объект создан до конца или когда созданный объект добавляется. Если Вы получаете дочерний объект через это событие, значит, дочерний объект полностью построен.

Для каждого дочернего виджета генерируется одно событие ChildAdded, ноль или больше событий ChildPolished и одно событие ChildRemoved.

Событие ChildPolished будет опущено, если дочерний объект удален немедленно после того как был добавлен. Если дочерний объект «полирован&qout; несколько раз, вы можете получить несколько событий от дочерних объектов каждый раз с различной виртуальной таблицей.

const QObjectList & QObject::children () const

Возвращает список дочерних объектов. Класс QObjectList определен в заголовочном файле следующим образом:

Первый добавленный дочерний объект — первый объект списка, а последний — последний объект в списке, т.е. новые дочерние объекты добавляются в конец списка.

При изменении порядка дочерних QWidget в списке, когда объект повышен или понижен обратите внимание, что виджет, который повышен становится последним объектом в списке, а пониженный виджет становится первым объектом в списке.

bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoCompatConnection ) [static]

Создает соединение типа type сигнала signal объекта sender с методом method в объекте receiver. При успешном выполнении возвращает true; в противном случае — false.

Вы должны использовать макросы SIGNAL() и SLOT() для спецификации signal and the method, например:

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

Также, сигнал может быть связан с другим сигналом:

В данном примере конструктор MyWidget перенаправляет сигнал от закрытой переменной и делает его доступным из MyWidget.

Сигнал может быть присоединен к нескольким слотам или сигналам. Несколько сигналов могут быть присоединены к одному слоту.

Если сигнал связан с несколькими слотами, то при инициализации сигнала слоты активизируются в произвольном порядке.

Если соединение сигнала со слотом произошло успешно, функция возвращает true. Она вернет false, если не удалось установить соединение, например, если QObject не смог установить сущетвование сигнала signal или метода method или если их определения несовместимы.

Сигнал испускается для каждой связи, то есть, если сигнал присоединен к двум слотам, то сигнал будет испускаться дважды. Вы всегда можете разорвать соединение вызвав disconnect().

Обратите внимание: Данная функция является потокозащищенной.

bool QObject::connect ( const QObject * sender, const char * signal, const char * method, Qt::ConnectionType type = Qt::AutoCompatConnection ) const

Данная перегруженная функция-член предоставлена для удобства. Ее поведение аналогично поведению вышеприведенной функции.

Выполняет присоединение сигнала signal объекта sender к методу method этого-же объекта.

Эквивалентно connect(sender, signal, this, method, type).

Обратите внимание: Данная функция является потокозащищенной.

void QObject::connectNotify ( const char * signal ) [virtual protected]

Данная виртуальная функция вызывается, если что-либо в объекте ранее было связано с сигналом signal в этом объекте.

Если Вы хотите сравнить signal со спецификой сигнала, используйте QLatin1String и макрос SIGNAL() следующим образом:

Если сигнал содержит множество параметров или параметры-контейнеры, примените QMetaObject::normalizedSignature() к результату работы макроса SIGNAL().

Предупреждение: Данная функция нарушает объектно-ориентированный принцип модульности. Однако, бывает полезно выполнить другую реализацию, если с сигналом связаны какие-либо действия.

void QObject::customEvent ( QEvent * event ) [virtual protected]

Эта функция может перегружена в подклассах для того, чтобы вызвать пользовательские события. Пользовательские события — события определенные пользователем типа QEvent::User перечисления QEvent::Type или определеные как подкласс QEvent. События передается через параметр event.

void QObject::deleteLater () [slot]

Отмечает объект для удаления.

Объект будет удален когда контроль вернется к циклу обработки сообщений.

Обратите внимание, что вход и выход из нового цикла обработки событий (например при открытии модального диалога) не выполнят отсроченное удаление; для того чтобы объект был удален, управление должно вернуться в тот цикл обработки событий, в котором была вызвана deleteLater().

vo >Данный сигнал испускается перед разрушением объекта obj и не может быть заблокирован.

После того, как этот сигнал испускается, разрушаются все дочерние по отношению к данному объекты.

bool QObject::disconnect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method ) [static]

Разъединяет сигнал signal в объекте sender с методом method в объекте receiver.

Связь сигнал-слот удаляется при разрушении любого из вовлеченнных в нее объектов.

Следующие примеры демонстрируют три типовых способа использования disconnect().

    Разъединение всех связей сигналов объекта:

эквивалентно нестатической перегужаемой функции

Разъединение всех связей определенного сигнала:

эквивалентно нестатической перегружаемой функции

Разъединение всех связей с определенным приемником:

эквивалентно нестатической перегружаемой функции

0 может использоваться как объединяющий символ, обозначающий «любой сигнал», «любой объект-приемник» или «любой слот объекта-приемника» соответственно.

Объект источник — sender — не может быть 0. (В одном вызове функции Вы можете уничтожить связи сигналов не более одного объекта.)

Если signal равен 0, то разъединяются связи методов method приемника receiver со всеми сигналами. В противном случае будут уничтожены связи конкретного сигнала.

Если receiver равен 0, то разъединяются все связи содержащие signal. В противном случае, слоты объектов отличных от receiver не разъединяются.

Если method равен 0, то разъединняются все связи приемника receiver. В противном случае, разъединяются только связи, содержащие слот method, а все другие слоты остаются не тронутыми. Параметр method должен быть равен 0 если receiver не определен, так что Вы не можете разъединить связи всех объектов содержащие определенный слот.

Обратите внимание: Данная функция является потокозащищенной.

bool QObject::disconnect ( const char * signal = 0, const QObject * receiver = 0, const char * method = 0 )

Данная перегруженная функция-член предоставлена для удобства. Ее поведение аналогично поведению вышеприведенной функции.

Разъединяет сигнал signal и слот method объекта-приемника receiver.

Связь сигнал-слот удаляется, когда разрушается любой из вовлеченных в нее объектов.

Обратите внимание: Данная функция является потокозащищенной.

bool QObject::disconnect ( const QObject * receiver, const char * method = 0 )

Данная перегруженная функция-член предоставлена для удобства. Ее поведение аналогично поведению вышеприведенной функции.

Разъединяет все сигналы объекта с методом method объекта-приемника receiver.

Связь сигнал-слот удаляется, когда разрушается любой из вовлеченных в нее объектов.

void QObject::disconnectNotify ( const char * signal ) [virtual protected]

Эта виртуальная функция вызывается когда разрушается связь в которой участвует сигнал signal данного объекта.

Пример сравнения сигнала signal с определенным сигналом приведен здесь: connectNotify()

Внимание: Данная функция нарушает объекто-ориентированный принцип модульности. Однако, она может быть полезна для обеспечения доступа к нужным ресурсам.

void QObject::dumpObjectInfo ()

Выводит информацию о связях сигнала и т.д. в окно отладки.

Данная функция полезна при отладке, но она ничего не делает, если программа скомпилирована в режиме создания исполяемого файла (т.е. без отладочной информации).

void QObject::dumpObjectTree ()

Выводит дерево дочерних объектов в окно отладки.

Данная функция полезна при отладке, но она ничего не делает, если программа скомпилирована в режиме создания исполяемого файла (т.е. без отладочной информации).

bool QObject::event ( QEvent * e ) [virtual]

Данная функция посылает события и возвращает true если событие e было получено и обработано.

Функция event() может быть перегружена, чтобы настроить поведение объекта.

bool QObject::eventFilter ( QObject * watched, QEvent * event ) [virtual]

Фильтрует события если данный объект установлен как фильтр событий для наблюдаемого объекта — watched.

В Вашей реализации функции, Вы можете фильтровать события event, т.е. если Вы хотите остановить отработку события, возвращайте true; в противном случае возвращайте false.

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

Внимание: Если Вы удаляете объект-приемник в данной функции, то обязательно возвратите true. В противном случае, Qt отправит событие удаленному объекту и программа может потерпеть крах.

T QObject::findChild ( const QString & name = QString() ) const

Возвращает дочерний объект, который может быть приведен к типу T and и имеет имя name или 0 если такой объект не найден. Пустая строка обозначает любое имя. Поиск выполняется рекурсивно.

Если существует более чем один дочерний объект соответствующий условию, то возвращается ближайший в иерархии. Если есть несколько равнозначных объектов в иерархии, будет возвращен один из них. В этом случает лучше использовать, findChildren().

В данном примере возвращается дочерний по отношению к parentWidget объект типа QPushButton с именем "button1":

В данном примере возвращается дочерний по отношению к parentWidget объект типа QListWidget:

Внимание: Данная функция не доступна в MSVC 6. Если Вы работаете с указанным компилятором, используйте qFindChild().

См. также findChildren() и qFindChild().

QList QObject::findChildren ( const QString & name = QString() ) const

Возвращает все дочерние, по отношению к данному, объекты имеющие имя name которые могут быть приведены к типу T или пустой список, если таких объектов нет. Пустая строка обозначает люсое имя. Поиск выполняется рекурсивно.

Следующий пример показывает как получить список дочерних по отношению к parentWidget объектов типа QWidget имеющих имя widgetname:

В данном примере возвращается список всех дочерних по отношению к parentWidget объектов типа QPushButton:

Внимание: Данная функция не доступна в MSVC 6. Если Вы работаете с указанным компилятором, используйте qFindChildren().

См. также findChild() и qFindChildren().

QList QObject::findChildren ( const QRegExp & regExp ) const

Данная перегруженная функция-член предоставлена для удобства. Ее поведение аналогично поведению вышеприведенной функции.

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

Внимание: Данная функция не доступна в MSVC 6. Если Вы работаете в указанным компилятором, используйте qFindChildren().

bool QObject::inherits ( const char * className ) const

Возвращает true в случае, если данный объект является экземпляром класса наследующего className или если подкласс QObject наследует className; в противном случае возвращает false.

Считается, что класс наследует себя самого.

По сравнению с использованием qobject_cast (object), данный метод является более быстрым и безопасным.

void QObject::installEventFilter ( QObject * filterObj )

Устанавливает фильтр событий filterObj в данном объекте. Например:

Фильтр сообщений — это объект, получающий все сообщения посланные данному объекту. Фильтр может отменить обработку сообщения или передать сообщение для дальнейшей обработки. Фильтр сообщений filterObj получает сообщения через свою функцию eventFilter(). Функция eventFilter() должна вернуть true если сообщение было отфильтровано, (т.е. остановлено); в противном случае возвращает false..

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

Пример класса KeyPressEater фильтрующего события клавиатуры посланные объекту:

Один фильтр сообщений можно установить на несколько виджетов:

Например, класс QShortcut использует эту технику для перехвата нажатия горячих клавиш.

Илон Маск рекомендует:  Сжатие html кода

Внимание: Если Вы удаляете объект-приемник в функции eventFilter(), то необходимо возвратить true. Если Вы возвратите false, Qt пошлет событие в удаленный объект, что приведет к краху программы.

bool QObject::isWidgetType () const

Возвращает true если объект является виджетом; в противном случае возвращает false.

Вызов данной функции эквивалентен вызову inherits(«QWidget»), но работает намного быстрее.

void QObject::killTimer ( int id )

Разрушает таймер с идентификатором id.

Идентификатор таймера возвращается при его запуске функцией startTimer().

const QMetaObject * QObject::metaObject () const [virtual]

Возвращает указатель на метаобъект данного объекта.

Метаобъект содержит информацию о классе наследующем QObject, имя класса, superclass name, свойства, сигналы и слоты. Каждый класс включающий макрос Q_OBJECT будет иметь метаобъект.

Информация содержащаяся в метаобъекте используется механизмом соединений сигнал/слот и системой свойств. Функция inherits() также реализована с использованием метаобъекта.

void QObject::moveToThread ( QThread * targetThread )

Изменяет принадлежность объекта и его дочерних объектов к потоку. Объект имеющий родителя не может быть перемещен в другой поток. Обработка событий будет продолжена в targetThread. Для перемещения объекта в основной поток, в качестве targetThread передайте QCoreApplication::thread().

Если в качестве targetThread передан ноль, только посланные события будут обработаны в основном потоке; все остальные события объекта и его дочерних объектов будут остановлены.

Обратите внимание, что у объекта будут повторно установлены. Сначала таймеры останавливаются в текущем потоке, а потом запускаются (с тем-же интервалом) в targetThread. В результате, постоянно перемещая объект между потоками, можно откладывать наступление событий таймер неопределенно долго.

Внимание: Данная функция не является потокобезопасной; текущий процесс должнен быть ближайшим текущим процессом. Другими словами, данная функция может только «передать» объект от текущего потока к другому, но не может «забрать» от другого потока и передать его в текущий.

QObject * QObject::parent () const

Возвращает указатель на родительский объект.

QVariant QObject::property ( const char * name ) const

Возвращает значение свойства объекта с именем name.

Если свойства с таким именем не существует, возвращается недействительное занчение.

Информация о всех доступных свойствах объекта получается через metaObject().

int QObject::receivers ( const char * signal ) const [protected]

Возвращает количество соединений с участием сигнала signal.

При вызове данной функции можно использовать макрос SIGNAL() для передачи определения сигнала:

Как показывает данный пример, Вы можете использовать эту функцию для предотвращения испускания сигнала, который никто не принимает.

Внимание: Данная функция нарушает объектно-ориентированный принцип модульности. Однако, она бывает полезна когда нужно выполнить какие-либо дорогие действия только в случае наличия соединений с сигналом.

void QObject::removeEventFilter ( QObject * obj )

Удаляет объект фильтра событий obj из данного объекта. Если такой фильтр событий не был установлен в данный объект, то ничего не происходит.


Все фильтры событий данного объекта автоматически удаляется при разрушении объекта.

Фильтр событий всегда можно без проблем удалить, даже если в данный момент он активирован (т.е. внутри функции eventFilter()).

QObject * QObject::sender () const [protected]

Возвращает указатель на объект пославший сигнал, если вызвана внутри слота, активизированного этим сигналом; в противном случае возвращает 0. Указатель действует только в течение времени, пока выполняется слот вызвавший эту функцию.

Указатель возвращенный функцией становится неудачным если объект-излучатель разрушен или если слот разъединен с сигналом объекта-излучателя.

Внимание: Данная функция нарушает объектно-ориентированный принцип модульности. Однако, доступ к объеку-излучателю бывает полезен, когда несколько сигналов связаны с одним слотом. Объект-излучатель неопределен когда слот вызывается как обычная функция C++.

void QObject::setParent ( QObject * parent )

Делает объект дочерним по отношению к объекту parent.

bool QObject::setProperty ( const char * name, const QVariant & value )

Устанавливает свойство объекта с именем name в значение value.

Возвращает true если операция прошла успешно; в противном случае возвращает false.

Информация о доступных функциях может быть получена с помощью metaObject().

bool QObject::signalsBlocked () const

Возвращает true если сигналы заблокированы; в противном случае возвращает false.

По умолчанию сигналы не заблокированы.

int QObject::startTimer ( int interval )

Запускает таймер и возвращает его идентификатор. Если таймер не удалось запустить, возвращает ноль.

Событие таймера наступает с периодичностью interval выраженный в миллисекундах пока за вызвана killTimer(). Если interval = 0, то событие таймера наступает каждый раз когда отсутствуют события окна для обработки.

Виртуальная функция timerEvent() вызывается с параметром класса события QTimerEvent всякий раз, когда наступает событие таймера. Реализуйте эту функция, чтобы отреагировать на событие таймера.

Если используется несколько таймеров, то для определения активного таймера можно использовать QTimerEvent::timerId().

Обратите внимание что точность QTimer зависит от основной операционной системы и аппаратных средств. Большинство платформ обеспечивают точность в 20 миллисекунд; некоторые больше. Если Qt не способен установить требуемое число, то тихо поставит возможное.

Класс QTimer предоставляет высокоуровневый программный интерфейс для работы с одиночными таймерами и сигналами таймеров вместо событий. Также есть класс QBasicTimer который является более легким и менее неуклюжим, чем QTimer и который обходится без идентификаторов таймеров.

QThread * QObject::thread () const

Возвращает поток в котором находится объект.

void QObject::timerEvent ( QTimerEvent * event ) [virtual protected]

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

QTimer provides a higher-level interface to the timer functionality, and also more general information about timers. The timer event is passed in the event parameter.

QString QObject::tr ( const char * sourceText, const char * comment ) [static]

Возвращает переведенную версию sourceText, или саму sourceText если нет соответствующей переведенной версии. Контекст перевода — Object и comment (по умолчанию 0). Все объекты, являющиеся подклассами QObject используют макрос Q_OBJECT который автоматически реализует эту функцию с именем подкласса в качестве контекста.

Внимание: Следует установить все переводчикиперед вызовом данного метода. Установка и удаление переводчиков во время перевода не поддерживается. Невыполнение этого требования чревато авариями и другими неудобствами.

QString QObject::trUtf8 ( const char * sourceText, const char * comment ) [static]

Возвращает переведенную версию sourceText или QString::fromUtf8(sourceText) если нет соответствующей переведенной версии. Говоря другими словами, функция идентична tr(sourceText, comment).

Внимание: Следует установить все переводчики перед вызовом данного метода. Установка и удаление переводчиков во время перевода не поддерживается. Невыполнение этого требования чревато авариями и другими неудобствами.

Внимание: Для обеспечения переносимости мы рекомендуем использовать escape-последовательности для обозначения не-ASCII символов в строковых литералах trUtf8(). Например:

Связанные Не-Члены

typedef QObjectList

T qFindChild ( const QObject * obj, const QString & name )

Эта перегружаемая функция создана для удобства. Ее поведение аналогично вышеупомянутой функции.

Вызов данной функции эквивалентен вызову obj->findChild (name). Эта функция поддерживается в MSVC 6, который не поддерживает шаблон функции-члена.

QList qFindChildren ( const QObject * obj, const QString & name )

Данная перегруженная функция-член предоставлена для удобства. Ее поведение аналогично поведению вышеприведенной функции.

Вызов данной функции эквивалентен вызову obj->findChildren (name). Эта функция поддерживается в MSVC 6, который не поддерживает шаблон функции-члена.

QList qFindChildren ( const QObject * obj, const QRegExp & regExp )

Данная перегруженная функция-член предоставлена для удобства. Ее поведение аналогично поведению вышеприведенной функции.

Вызов данной функции эквивалентен вызову obj->findChildren (regExp). Эта функция поддерживается в MSVC 6, который не поддерживает шаблон функции-члена.

T qobject_cast ( QObject * object )

Возвращает полученный объект object приведенный к типу T если данный объект имее тип T (или является его подклассом); в противном случае возвращает 0.

Класс считается наследником самого себя.

Функция qobject_cast() работает аналогично страндартной функции C++ dynamic_cast() с тем исключением, что не требует поддержки RTTI и работает через границы библиотек.

qobject_cast() также может использоваться совместно с интерфейсами; для более детальной информации см. Plug & Paint.

Описание Макросов

Q_CLASSINFO ( Name, Value )

Данный макрос включает в класс дополнительную информацию, которая доступна через QObject::metaObject(). Этот макрос нужен Qt для реализации расширения ActiveQt.

Данный макрос принимает строку Name и строку литералов Value.

Q_ENUMS ( . )

Данный макрос регистрирует один или несколько типов перечислений в метаобъектной системе.

Q_FLAGS ( . )

Данный макрос регистрирует один или несколько типов «флагов» в метаобъектной системе.

Q_INTERFACES ( . )

Данный макрос сообщает Qt об объединениях инструметов класса. Используется при создании плагинов.

Для получения более детальной информации см. пример Основные инструменты Plug & Paint.

Q_OBJECT

Макрос Q_OBJECT должен быть вставлен в секцию определений любого объекта имеющего сигналы и слоты или использующего предоставляемую метаобъектной системой Qt информацию.

Q_PROPERTY ( . )

Данный макрос декларирует свойство QObject. Синтаксис:

Delphi-Help

TObject

TObject

Описание

type TObject = class
constructor Create;
.
.
destructor Destroy; virtual;
end;

Тип TObject определяет тип базового класса . Он является самым старым прародителем всех классов — каждый класс, в конечном счете, получен из TObject.

Из-за этого, каждый объект унаследовал методы TObject.

Методы TObject относятся к двум категориям — класс и не класс. Когда предустановленно ключевое слово Class, метод можно вызвать и в объекте класса, и в классе непосредственно. Такой статический метод не может обратиться ни к каким полям класса, потому что сам класс не имеет никаких данных, только объекты — имеют данные.

Некоторые ключевые (статические) методы Class:

function ClassName Выдает имя класса как строку
ClassParent Выдает имя родителя класса
ClassInfo Выдает Run Time информацию класса
InstanceSize Размер объекта класса в байтах
NewInstance Создает новый объект класса

Некоторые ключевые методы Object:

Create Создатель пустого объекта
Free Вызывает Destroy для ненулевых объектов
Destroy Высвобождение памяти объекта
AfterConstruction Вызывается после построения
BeforeDestruction Вызывается перед разрушением

Пример кода

begin
// Форма модуля была получена от TObject.
// Так что мы можем использовать методы TObject:
ShowMessage(‘Имя класса объекта Form1 = ‘+
Form1.ClassName);
ShowMessage(‘Имя родительского класса объекта Form1 = ‘+
Form1.ClassParent.ClassName);
ShowMessage(‘Размер образца объекта Form1 = ‘+
IntToStr(Form1.InstanceSize));

// И теперь непосредственно TObject
ShowMessage(‘Имя класса TObject = ‘+
TObject .ClassName);
ShowMessage(‘Размер образца TObject = ‘+
IntToStr( TObject .InstanceSize));
end;

Имя класса объекта Form1 = TForm1
Имя родительского класса объекта Form1 = TForm
Размер образца объекта Form1 = 764
Имя класса TObject = TObject
Размер образца TObject = 4

КЛАССЫ И ОБЪЕКТЫ Delphi

Для реализации интерфейса Delphi использует библиотеку классов, которая содержит большое количество разнообразных классов, поддерживающих форму и различные компоненты формы (командные кнопки, поля редактирования и т. д.).

Классыи Объекты Delphi имеют следующую иерархию (см. диаграмму): Самый первый класс (основной), который не имеет предков, а сам является предком для всех остальных – TObject.

TObject.Этот класс не имеет полей и свойств, но включает в себя методы самого общего назначения, обеспечивающие весь жизненный цикл любых объектов – от их создания до уничтожения.

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

Класс TComponent умеет взаимодействовать со средой разработчика и передает это умение потомкам всем компонентам Delphi.

Класс TСontrol умеет взаимодействовать со средой и умеет обслуживать видимые на экране изображения,

а его потомок может создавать Windows-окна и т. д.

Если выразить наследование в виде иерархической структуры, то для созданных элементов управления Button1, Button2 и CheckBox1 получим следующую диаграмму:

Например, элемент управления CheckBox1 (т.е. класс CheckBox1) может наследовать все или некоторые свойства и методы, вышестоящих по иерархии классов, а никакие черты от класса TButton – наследовать не может. Другими словами можно сказать, что CheckBox1 произведен (derived) непосредственно от класса-предка TCheckBox, а также от TObject, TPersistent, TComponent, TControl и TWinControl.

Классы бывают абстрактными , это те классы ,что не имеют объектов. например TObject Абстрактные методы – методы, которые не содержат исполняемых операторов и служат заготовками для аналогичных методов в объектах – потомках. Абстрактные методы должны перекрываться в потомках.

Во время проектирования формы приложения Delphi автоматически добавляет в текст программы необходимые объекты. Если сразу после запуска Delphi просмотреть содержимое окна редактора кода, то там можно обнаружить следующие строки:

Type

TForm1 = class(TForm)

Private

Public

end;

Var

Это описание класса исходной, пустой формы приложения и объявление объекта — формы приложения.

Когда программист, добавляя необходимые компоненты, создает форму, Delphi формирует описание класса формы. Когда программист создает функцию обработки события формы или ее компонента, Delphi добавляет объявление метода в описание класса формы приложения.

Помимо классов визуальных компонентов в библиотеку классов входят и классы так называемых невизуальных (невидимых) компонентов, которые обеспечивают создание соответствующих объектов и доступ к их методам и свойствам. Типичным примером невизуального компонента является таймер (тип TTimer) и компоненты доступа и управления базами данных. Существует еще множество других классов,

ПОЛИМОРФИЗМ

Полиморфизмнеразрывно связан с наследованием

Полиморфизм– возможность замещения методов класса-родителя одноименными методами класса-потомка.

Другими словами, — это свойство классов решать сходные по смыслу задачи разными способами.

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

Для изменения метода необходимо перекрыть его в потомке, т.е. объявить в потомке одноименный метод и реализовать в нем нужные действия.

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

Способность использования одного и того же метода сообразно своему классу называется полиморфизмом.

В зависимости от того, какие действия происходят при вызове, методы делятся на следующие группы:

Класс TEmpioyee должен иметь свой собственный конструктор, обеспечивающий инициализацию класса-родителя и своих полей. Вот пример реализации конструктора класса TEmployee:

constructorTEmpioyee.Create(Name:Tname;Dep:integer);

Begin

inheritedCreate(Name);//inherited (англ.- унаследованный)

end;

В приведенном примере директивой inherited (англ.- унаследованный ) вызывается конструктор родительского класса. После этого присваивается значение полю класса-потомка.

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

Var engineer :TEmployee;

engineer := TEmployee.Create(‘Сидоров’,413);

engineer.address := ‘ул.Блохина, д.8, кв.10’;

engineer.age := 23;

if engineer.dep=413 then …

Type

Person=class

name: string;

constructor Create(nm: string; ag: integer);

Begin

end;

procedure Print;

Begin

writeln(‘Имя: ‘,name,’ Возраст: ‘,age);

end;

end;

Student=class(Person)

course, group: integer; новые поля

constructor Create(nm: string; ag,c,gr: integer);

begin //директивой inherited (англ.- унаследованный ) вызывается конструктор родительского //класса. После этого присваивается значение полю класса-потомка.

inherited Create(nm,ag); //перекрытие метода родительского

course:=c; group:=gr; //и добавление новых действий в методе

end;

procedure Print;

Begin

inherited Print; //перекрытие метода родительского

writeln(‘Курс: ‘,course,’ Группа: ‘,group);// и добавление новых действий в методе

end;

end;

Здесь метод Print производного класса Student вызывает вначале метод Print, унаследованный от базового класса Person, с помощью конструкции inherited Print. Аналогично конструктор Create класса Student вызывает вначале конструктор Create базового класса Person, также используя служебное слово inherited. Следует обратить внимание, что конструктор базового класса вызывается в этом случае как процедура, а не как функция, при этом создания нового объекта не происходит.

Конструктор Create класса TObject.

Выполняет общие стандартные действия по созданию объектов.

1. Выделяет память для объекта с помощью использования метода newInstance класса TObject, который в свою очередь вызывает метод InstanceSize(метод класса TObject) для определения размера памяти, требуемого для данного объекта.

2. Инициализирует поля созданного объекта нулевыми значениями с помощью метода InitInstance класса TObject.

Конструктор Create класса TObject объявлен статическим и не содержит параметров, но в некоторых классах он переопределяется.

Constructor Create (AOwner:TComponent);virtual;

Деструктор Destroy класса TObject.

Выполняет общие стандартные действия по уничтожению объекта с помощью метода FreeInstance класса. TObject, который в свою очередь вызывает метод CleanUpInstance.для корректного завершения работы со сложными структурами данных

Вызывает метод InstanceSize для определения размера памяти, занимаемого удаляемым объектом.

Деструктор Destroy в классе TObject виртуальный, если в производных классах он переопределяется, необходимо использовать директиву override.

Одним из аргументов обработчика событий обычно яляется параметр Sender, имеющий тип TObject. Фактические это означает что Sender может принадлежать любому классу. Таким образом недостатком является то, что неизвестно, к какому именно классу принадлежит данный объект.

Проблема решается при помощи механизмов RTTI или при помощи методов класса TObject.

Procedure …………….. (sender: TObject)

If Sender is TButton

Сущевует и доругой подход, в отнощении любого объекта можно использовать методы, определенные в ….. TObject.

Например, метод ClassName возвращает строку, возвращающую имя класса. Это классовый метод, поэтому его можно применят как в отнощении объекта, так и в отношении класса.

Результат будет одинаковый.

Бывают ситуации когда необходимо получить имя класса, но чаще требуется получить ссылку на сам класс или на его базовый класс. Ссылка на класс позволяет выполнять операции в отношении класса в процессе выполнения программы. А имя класса это всего лишь строка символов.

Ссылку на класс можно получить при помощи методов:

ClassParent // родительский класс

Получив ссылку на класс можно использовать в отношении неё любой из методов класса TObject.

InstanceSize отличается от функции SizeOf.

sizeOf к любому объекту вернет 4 байта, т.к. переменная в Обжект паскале всего лишь ссылка, а объекты динамические на самом деле.

Метод InstanceSize возвращает размер объекта в процессе выполнения программы(не путать с функцией sizeOf, которая возвращает размер ссылки на объект, т.е. 4 байта).

Метод ClassInfo возвращает указать на внутреннюю информацию RTTI.

Пример того, как методы класса TObject можно использовать для получения инфы о классе.

Procedure TSenderForm.ShowSender (Sender:TObject);

If sender.ClassParent <> nil then

Данный метод соединен с событием onClick нескольких элементов управления.

Баттон 1 Едит1 ЧекБокс поле

События.

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

События – это не в полнее новый механизм, т.к. технически события это свойство, которое в отличии от других свойств ссылается не на данные а на методы. Т.е. событие – это свойство типа “указатель на метод”.

События в Дельфи генерируются, например, в следующих случаях, например, когда пользователь воздействует на компонент (щелкает мышкой).

Порождается в ответ на вызов метода или на изменение свойств компонента(если установить фокус ввода на один компонент, то компонент, на котором фокус ввода был до этого теряет его, инициируя соответствующее событие).

Большинство событий в Дельфи инициируется при получении соответствующего сообщения Windows, хотя событие и не образует взаимно-однозначного соответствия с этими сообщения.

Сообщение – это извещение о некотором месте событии, посылаемом в систему Windows в адрес пользователя. Любые действия пользователя – щелчок мыши, изменение размеров окна приложения – вынуждают Windows отправить приложению сообщение.

Сообщение – это определенная запись, передаваемая приложению. Она содержит сведения о том, что произошло в системе, а также дополнительную информацию, зависящую от типа сообщения. Система сообщений Windows состоит из трех компонентов,:

1)-очередь сообщений (отдельная для каждого приложения)

Приложение получает сообщения из очереди и передает их соответствующему окну.

Группа циклически выполняемых операторов приложения, осуществляющих выборку сообщений из очереди и передачу их соответствующему окну для обработки.

Каждое окно приложения имеет собственную процедуру, которая получает все передаваемые окну сообщения, в ответ она должна выполнить определенные действия.

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

В отличии от событий в Дельфи, обработка сообщений является обязательной и не может выполняться или не выполняться по усмотрению программиста.

Система событий дельфи представляет собой интерфейс для взаимодействия с сообщениями Windows (с некоторой их частью). Многие события компонентов непосредственно связаны с сообщениями Windows, кроме того Дельфи генерирует ряд дополнительных межкомпонентных сообщений.

С теоретической точки зрения , событие – это результат запроса, посланного компоненту или элементу управления, при этом компонент или элемент управления может ответить на это сообщение.

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

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

Дата добавления: 2020-07-27 ; просмотров: 618 ; ЗАКАЗАТЬ НАПИСАНИЕ РАБОТЫ

Описание класса QObject

Класс QObject — это базовый класс для всех объектов Qt. Далее.

Свойства

Открытые функции

QObject ( QObject * parent = 0 )
virtual

QObject ()

bool blockSignals ( bool block )
const QObjectList & children () const
bool connect ( const QObject * sender, const char * signal, const char * method, Qt::ConnectionType type = Qt::AutoConnection ) const
bool disconnect ( const char * signal = 0, const QObject * receiver = 0, const char * method = 0 )
bool disconnect ( const QObject * receiver, const char * method = 0 )
void dumpObjectInfo ()
void dumpObjectTree ()
QList dynamicPropertyNames () const
virtual bool event ( QEvent * e )
virtual bool eventFilter ( QObject * watched, QEvent * event )
T findChild ( const QString & name = QString() ) const
QList findChildren ( const QString & name = QString() ) const
QList findChildren ( const QRegExp & regExp ) const
bool inherits ( const char * className ) const
void installEventFilter ( QObject * filterObj )
bool isWidgetType () const
void killTimer ( int id )
virtual const QMetaObject * metaObject () const
void moveToThread ( QThread * targetThread )
QString objectName () const
QObject * parent () const
QVariant property ( const char * name ) const
void removeEventFilter ( QObject * obj )
void setObjectName ( const QString & name )
void setParent ( QObject * parent )
bool setProperty ( const char * name, const QVariant & value )
bool signalsBlocked () const
int startTimer ( int interval )
QThread * thread () const

Открытые слоты

Сигналы

void destroyed ( QObject * obj = 0 )

Статические открытые члены

bool connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection )
bool disconnect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method )
const QMetaObject staticMetaObject
QString tr ( const char * sourceText, const char * disambiguation = 0, int n = -1 )
QString trUtf8 ( const char * sourceText, const char * disambiguation = 0, int n = -1 )

Защищенные функции

virtual void childEvent ( QChildEvent * event )
virtual void connectNotify ( const char * signal )
virtual void customEvent ( QEvent * event )
virtual void disconnectNotify ( const char * signal )
int receivers ( const char * signal ) const
QObject * sender () const
virtual void timerEvent ( QTimerEvent * event )

Связанные нечлены класса

typedef QObjectList
T qFindChild ( const QObject * obj, const QString & name )
QList qFindChildren ( const QObject * obj, const QString & name )
QList qFindChildren ( const QObject * obj, const QRegExp & regExp )
T qobject_cast ( QObject * object )

Макросы

Q_CLASSINFO ( Name, Value )
Q_DISABLE_COPY ( Class )
Q_EMIT
Q_ENUMS ( . )
Q_FLAGS ( . )
Q_INTERFACES ( . )
Q_INVOKABLE
Q_OBJECT
Q_PROPERTY ( . )
Q_SIGNAL
Q_SIGNALS
Q_SLOT
Q_SLOTS

Подробное описание

Класс QObject — это базовый класс для всех объектов Qt.

QObject is the heart of the Qt Object Model. Главная особенность в этой модели — это очень мощный механизм для связи объектов, называемый сигналами и слотами. Вы можете соединить сигнал со слотом с помощью connect () и разъединить с помощью disconnect (). Во избежание возникновения замкнутых циклов вызовов можно временно блокировать сигналы с помощью blockSignals(). Защищенные функции connectNotify () и disconnectNotify () позволяют отслеживать соединения.

QObjects organize themselves in object trees. When you create a QObject with another object as parent, the object will automatically add itself to the parent’s children() list. The parent takes ownership of the object; i.e., it will automatically delete its children in its destructor. You can look for an object by name and optionally type using findChild() or findChildren().

Каждый объект имеет objectName — имя объекта, а имя его класса можно найти через соответствующую функцию metaObject() (смотрите функцию QMetaObject::className()). Вы можете определить унаследован ли класс от другого класса, в иерархии наследования QObject, используя функцию inherits().

Когда объект удалён, он посылает сигнал destroyed(). You can catch this signal to avoid dangling references to QObjects.

QObjects can receive events through event() and filter the events of other objects. See installEventFilter() and eventFilter() for details. A convenience handler, childEvent(), can be reimplemented to catch child events.

События доставляются в поток, в котором объект был создан; Для получения подробной информации смотрите Поддержка потоков в Qt и функцию thread(). Note that event processing is not done at all for QObjects with no thread affinity (thread() returns zero). Use the moveToThread() function to change the thread affinity for an object and its children (the object cannot be moved if it has a parent).

Последнее, но не менее важное, QObject предоставляет базовую поддержку таймера в Qt; информацию о высокоуровневой поддержке таймеров смотрите QTimer.

Обратите внимание, что макрос Q_OBJECT является обязательным для любого объекта, реализующим сигналы, слоты и свойства. Вам также необходимо запустить Мета-объектный компилятор (Meta Object Compiler) для исходного файла. Мы настоятельно рекомендуем использовать этот макрос во всех подклассах QObject независимо от того, действительно ли они используют сигналы, слоты и свойства, так как в противном случае некоторые функции могут вести себя неправильно.

Все виджеты Qt унаследованы от QObject. Вспомогательная функция isWidgetType() возвращает, действительно ли объект является виджетом. Она работает намного быстрее, чем qobject_cast (obj) или obj->inherits(«QWidget»).

Некоторые функции QObject, например, children(), возвращают QObjectList. QObjectList — это typedef для QList .

Нет конструктора копирования или оператора присваивания

QObject не имеет ни конструктора копирования ни оператора присваивания. Таков замысел. В действительности, они объявлены, но в секции private с помощью макроса Q_DISABLE_COPY(). Фактически, все классы Qt произошедшие от QObject (прямо или косвенно), используют этот макрос, чтобы объявить их конструктор копирования и оператор присваивания закрытыми. The reasoning is found in the discussion on Identity vs Value on the Qt Object Model page.

Основное последствие — то, что вы должны использовать указатели на QObject (или на ваш подкласс QObject) там, где вы бы могли, в других случаях, соблазниться использовать ваш наследник QObject, как значение. Например, без конструктора копирования, вы не можете использовать подкласс QObject как значение, чтобы сохранить его в одном из классов-контейнеров. Вы должны сохранять указатели.

Автосединение

Мета-объектная система Qt предоставляет механизм для автоматического соединения сигналов и слотов между подклассами QObject и их дочерними объектами. До тех пор, пока объекты определены с надлежащими именами, а слоты соответствуют простому соглашению об именовании, это соединение может быть выполнено во время выполнения, функцией QMetaObject::connectSlotsByName().

uic генерирует код, который вызывает эту функцию, позволить выполнятся автосоединению между виджетами на форме, созданной с помощью Qt Designer. More information about using auto-connection with Qt Designer is given in the Using a Designer UI File in Your Application section of the Qt Designer manual.

Динамические свойства

Начиная с Qt 4.2, динамические свойства могут быть добавлены и удалены из экземпляра QObject во время выполнения. Динамические свойства не нужно объявлять во время компиляции, тем не менее они предоставляют такие же приемущества как и статические свойства и управляются используя тот же API — используя функцию property(), чтобы читать их и setProperty(), чтобы писать их.

Начиная с Qt 4.3, динамические свойства поддерживаются Qt Designer’ом, и формам на основе стандартных виджетов Qt и на основе пользовательских, могут быть заданны динамические свойства.


Internationalization (i18n)

All QObject subclasses support Qt’s translation features, making it possible to translate an application’s user interface into different languages.

To make user-visible text translatable, it must be wrapped in calls to the tr() function. This is explained in detail in the Writing Source Code for Translation document.

Описание свойств

objectName : QString

Это свойство содержит имя объекта.

Вы можете найти объект по имени (и типу) используя findChild(). Вы можете получить множество объектов с помощью findChildren().

По умолчанию это свойство содержит пустую строку.

QString objectName () const
void setObjectName ( const QString & name )

Описание функций-членов

QObject:: QObject ( QObject * parent = 0 )

Constructs an object with parent object parent.

The parent of an object may be viewed as the object’s owner. For instance, a dialog box is the parent of the OK and Cancel buttons it contains.

The destructor of a parent object destroys all child objects.

Setting parent to 0 constructs an object with no parent. If the object is a widget, it will become a top-level window.

QObject::

Destroys the object, deleting all its child objects.

All signals to and from the object are automatically disconnected, and any pending posted events for the object are removed from the event queue. However, it is often safer to use deleteLater() rather than deleting a QObject subclass directly.

Warning: All child objects are deleted. If any of these objects are on the stack or global, sooner or later your program will crash. We do not recommend holding pointers to child objects from outside the parent. If you still do, the destroyed() signal gives you an opportunity to detect when an object is destroyed.

Warning: Deleting a QObject while pending events are waiting to be delivered can cause a crash. You must not delete the QObject directly if it exists in a different thread than the one currently executing. Use deleteLater() instead, which will cause the event loop to delete the object after all pending events have been delivered to it.

bool QObject:: blockSignals ( bool block )

If block is true, signals emitted by this object are blocked (i.e., emitting a signal will not invoke anything connected to it). If block is false, no such blocking will occur.

The return value is the previous value of signalsBlocked().

Note that the destroyed() signal will be emitted even if the signals for this object have been blocked.

void QObject:: childEvent ( QChildEvent * event ) [virtual protected]

This event handler can be reimplemented in a subclass to receive child events. The event is passed in the event parameter.

QEvent::ChildAdded and QEvent::ChildRemoved events are sent to objects when children are added or removed. In both cases you can only rely on the child being a QObject, or if isWidgetType() returns true, a QWidget. (This is because, in the ChildAdded case, the child is not yet fully constructed, and in the ChildRemoved case it might have been destructed already).

QEvent::ChildPolished events are sent to widgets when children are polished, or when polished children are added. If you receive a child polished event, the child’s construction is usually completed. However, this is not guaranteed, and multiple polish events may be delivered during the execution of a widget’s constructor.

For every child widget, you receive one ChildAdded event, zero or more ChildPolished events, and one ChildRemoved event.

The ChildPolished event is omitted if a child is removed immediately after it is added. If a child is polished several times during construction and destruction, you may receive several child polished events for the same child, each time with a different virtual table.

const QObjectList & QObject:: children () const

Returns a list of child objects. The QObjectList class is defined in the header file as the following:

The first child added is the first object in the list and the last child added is the last object in the list, i.e. new children are appended at the end.

Note that the list order changes when QWidget children are raised or lowered. A widget that is raised becomes the last object in the list, and a widget that is lowered becomes the first object in the list.

bool QObject:: connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection ) [static]

Создает соединение заданного типа type между сигналом signal объекта-отправителя sender и методом method в объекте-приёмнике receiver. Возвращает true, если соединение удалось; в противном случае возвращает false.

Вы должны использовать макросы SIGNAL() и SLOT(), когда указываете signal и method, например:

Этот пример гарантирует, что метка всегда отображает текущее значение линейки прокрутки. Заметьте, что параметры сигналов и слотов не должны содержать имен переменных, а только их тип. Следующий пример не будет работать и вернёт false:

Сигнал, также может быть соединён с другим сигналом:

In this example, the MyWidget constructor relays a signal from a private member variable, and makes it available under a name that relates to MyWidget.

A signal can be connected to many slots and signals. Many signals can be connected to one slot.

If a signal is connected to several slots, the slots are activated in the same order as the order the connection was made, when the signal is emitted.

The function returns true if it successfully connects the signal to the slot. It will return false if it cannot create the connection, for example, if QObject is unable to verify the existence of either signal or method, or if their signatures aren’t compatible.

By default, a signal is emitted for every connection you make; two signals are emitted for duplicate connections. You can break all of these connections with a single disconnect() call. If you pass the Qt::UniqueConnection type, the connection will only be made if it is not a duplicate. If there is already a duplicate (exact same signal to the exact same slot on the same objects), the connection will fail and connect will return false.

The optional type parameter describes the type of connection to establish. В частности определяет доставляется ли сигнал слоту немедленно или ставится в очередь. If the signal is queued, the parameters must be of types that are known to Qt’s meta-object system, because Qt needs to copy the arguments to store them in an event behind the scenes. Если вы пытаетесь использовать соединение через очередь и получаете сообщение об ошибке

вызовите qRegisterMetaType(), чтобы зарегистрировать тип данных перед установлением соединения.

bool QObject:: connect ( const QObject * sender, const char * signal, const char * method, Qt::ConnectionType type = Qt::AutoConnection ) const

This function overloads connect().

Connects signal from the sender object to this object’s method.

Equivalent to connect(sender, signal, this, method, type).

Every connection you make emits a signal, so duplicate connections emit two signals. You can break a connection using disconnect().

void QObject:: connectNotify ( const char * signal ) [virtual protected]

This virtual function is called when something has been connected to signal in this object.

If you want to compare signal with a specific signal, use QLatin1String and the SIGNAL() macro as follows:

If the signal contains multiple parameters or parameters that contain spaces, call QMetaObject::normalizedSignature() on the result of the SIGNAL() macro.

Warning: This function violates the object-oriented principle of modularity. However, it might be useful when you need to perform expensive initialization only if something is connected to a signal.

void QObject:: customEvent ( QEvent * event ) [virtual protected]

This event handler can be reimplemented in a subclass to receive custom events. Custom events are user-defined events with a type value at least as large as the QEvent::User item of the QEvent::Type enum, and is typically a QEvent subclass. The event is passed in the event parameter.

void QObject:: deleteLater () [slot]

Schedules this object for deletion.

The object will be deleted when control returns to the event loop. If the event loop is not running when this function is called (e.g. deleteLater() is called on an object before QCoreApplication::exec()), the object will be deleted once the event loop is started.

Note that entering and leaving a new event loop (e.g., by opening a modal dialog) will not perform the deferred deletion; for the object to be deleted, the control must return to the event loop from which deleteLater() was called.

Note: It is safe to call this function more than once; when the first deferred deletion event is delivered, any pending events for the object are removed from the event queue.

void QObject:: destroyed ( QObject * obj = 0 ) [signal]

This signal is emitted immediately before the object obj is destroyed, and can not be blocked.

All the objects’s children are destroyed immediately after this signal is emitted.

bool QObject:: disconnect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method ) [static]

Disconnects signal in object sender from method in object receiver. Returns true if the connection is successfully broken; otherwise returns false.

A signal-slot connection is removed when either of the objects involved are destroyed.

disconnect() is typically used in three ways, as the following examples demonstrate.

    Disconnect everything connected to an object’s signals:

equivalent to the non-static overloaded function

Disconnect everything connected to a specific signal:

equivalent to the non-static overloaded function

Disconnect a specific receiver:

equivalent to the non-static overloaded function

0 may be used as a wildcard, meaning «any signal», «any receiving object», or «any slot in the receiving object», respectively.

The sender may never be 0. (You cannot disconnect signals from more than one object in a single call.)

If signal is 0, it disconnects receiver and method from any signal. If not, only the specified signal is disconnected.

If receiver is 0, it disconnects anything connected to signal. If not, slots in objects other than receiver are not disconnected.

If method is 0, it disconnects anything that is connected to receiver. If not, only slots named method will be disconnected, and all other slots are left alone. The method must be 0 if receiver is left out, so you cannot disconnect a specifically-named slot on all objects.

bool QObject:: disconnect ( const char * signal = 0, const QObject * receiver = 0, const char * method = 0 )

This function overloads disconnect().

Disconnects signal from method of receiver.

A signal-slot connection is removed when either of the objects involved are destroyed.

bool QObject:: disconnect ( const QObject * receiver, const char * method = 0 )

This function overloads disconnect().

Disconnects all signals in this object from receiver‘s method.

A signal-slot connection is removed when either of the objects involved are destroyed.

void QObject:: disconnectNotify ( const char * signal ) [virtual protected]

This virtual function is called when something has been disconnected from signal in this object.

See connectNotify() for an example of how to compare signal with a specific signal.

Warning: This function violates the object-oriented principle of modularity. However, it might be useful for optimizing access to expensive resources.

void QObject:: dumpObjectInfo ()

Dumps information about signal connections, etc. for this object to the debug output.

This function is useful for debugging, but does nothing if the library has been compiled in release mode (i.e. without debugging information).

void QObject:: dumpObjectTree ()

Dumps a tree of children to the debug output.

This function is useful for debugging, but does nothing if the library has been compiled in release mode (i.e. without debugging information).

QList QByteArray > QObject:: dynamicPropertyNames () const

Returns the names of all properties that were dynamically added to the object using setProperty().

Эта функция была введена в Qt 4.2.

bool QObject:: event ( QEvent * e ) [virtual]

This virtual function receives events to an object and should return true if the event e was recognized and processed.

The event() function can be reimplemented to customize the behavior of an object.

bool QObject:: eventFilter ( QObject * watched, QEvent * event ) [virtual]

Filters events if this object has been installed as an event filter for the watched object.

In your reimplementation of this function, if you want to filter the event out, i.e. stop it being handled further, return true; otherwise return false.

Notice in the example above that unhandled events are passed to the base class’s eventFilter() function, since the base class might have reimplemented eventFilter() for its own internal purposes.

Warning: If you delete the receiver object in this function, be sure to return true. Otherwise, Qt will forward the event to the deleted object and the program might crash.

T QObject:: findChild ( const QString & name = QString() ) const

Returns the child of this object that can be cast into type T and that is called name, or 0 if there is no such object. Omitting the name argument causes all object names to be matched. The search is performed recursively.

If there is more than one child matching the search, the most direct ancestor is returned. If there are several direct ancestors, it is undefined which one will be returned. In that case, findChildren() should be used.

This example returns a child QPushButton of parentWidget named "button1":

This example returns a QListWidget child of parentWidget:

Warning: This function is not available with MSVC 6. Use qFindChild() instead if you need to support that version of the compiler.

QList T > QObject:: findChildren ( const QString & name = QString() ) const

Returns all children of this object with the given name that can be cast to type T, or an empty list if there are no such objects. Omitting the name argument causes all object names to be matched. The search is performed recursively.

The following example shows how to find a list of child QWidgets of the specified parentWidget named widgetname:

This example returns all QPushButtons that are children of parentWidget:

Warning: This function is not available with MSVC 6. Use qFindChildren() instead if you need to support that version of the compiler.

QList T > QObject:: findChildren ( const QRegExp & regExp ) const

This function overloads findChildren().

Returns the children of this object that can be cast to type T and that have names matching the regular expression regExp, or an empty list if there are no such objects. The search is performed recursively.

Warning: This function is not available with MSVC 6. Use qFindChildren() instead if you need to support that version of the compiler.

bool QObject:: inherits ( const char * className ) const

Returns true if this object is an instance of a class that inherits className or a QObject subclass that inherits className; otherwise returns false.

A class is considered to inherit itself.

If you need to determine whether an object is an instance of a particular class for the purpose of casting it, consider using qobject_cast (object) instead.

void QObject:: installEventFilter ( QObject * filterObj )

Installs an event filter filterObj on this object. Например:

An event filter is an object that receives all events that are sent to this object. The filter can either stop the event or forward it to this object. The event filter filterObj receives events via its eventFilter() function. The eventFilter() function must return true if the event should be filtered, (i.e. stopped); otherwise it must return false.

If multiple event filters are installed on a single object, the filter that was installed last is activated first.

Here’s a KeyPressEater class that eats the key presses of its monitored objects:

And here’s how to install it on two widgets:

The QShortcut class, for example, uses this technique to intercept shortcut key presses.

Warning: If you delete the receiver object in your eventFilter() function, be sure to return true. If you return false, Qt sends the event to the deleted object and the program will crash.

Note that the filtering object must be in the same thread as this object. If filterObj is in a different thread, this function does nothing. If either filterObj or this object are moved to a different thread after calling this function, the event filter will not be called until both objects have the same thread affinity again (it is not removed).

bool QObject:: isWidgetType () const

Returns true if the object is a widget; otherwise returns false.

Calling this function is equivalent to calling inherits(«QWidget»), except that it is much faster.

void QObject:: killTimer ( int id )

Kills the timer with timer identifier, id.

The timer identifier is returned by startTimer() when a timer event is started.

const QMetaObject * QObject:: metaObject () const [virtual]

Returns a pointer to the meta-object of this object.

A meta-object contains information about a class that inherits QObject, e.g. class name, superclass name, properties, signals and slots. Every QObject subclass that contains the Q_OBJECT macro will have a meta-object.

The meta-object information is required by the signal/slot connection mechanism and the property system. The inherits() function also makes use of the meta-object.

If you have no pointer to an actual object instance but still want to access the meta-object of a class, you can use staticMetaObject.

void QObject:: moveToThread ( QThread * targetThread )

Changes the thread affinity for this object and its children. The object cannot be moved if it has a parent. Event processing will continue in the targetThread.

To move an object to the main thread, use QApplication::instance() to retrieve a pointer to the current application, and then use QApplication::thread() to retrieve the thread in which the application lives. Например:

If targetThread is zero, all event processing for this object and its children stops.

Note that all active timers for the object will be reset. The timers are first stopped in the current thread and restarted (with the same interval) in the targetThread. As a result, constantly moving an object between threads can postpone timer events indefinitely.

A QEvent::ThreadChange event is sent to this object just before the thread affinity is changed. You can handle this event to perform any special processing. Note that any new events that are posted to this object will be handled in the targetThread.

Warning: This function is not thread-safe; the current thread must be same as the current thread affinity. In other words, this function can only «push» an object from the current thread to another thread, it cannot «pull» an object from any arbitrary thread to the current thread.

QObject * QObject:: parent () const

Returns a pointer to the parent object.

QVariant QObject:: property ( const char * name ) const

Returns the value of the object’s name property.

If no such property exists, the returned variant is invalid.

Information about all available properties is provided through the metaObject() and dynamicPropertyNames().

int QObject:: receivers ( const char * signal ) const [protected]

Returns the number of receivers connected to the signal.

Since both slots and signals can be used as receivers for signals, and the same connections can be made many times, the number of receivers is the same as the number of connections made from this signal.

When calling this function, you can use the SIGNAL() macro to pass a specific signal:

As the code snippet above illustrates, you can use this function to avoid emitting a signal that nobody listens to.

Warning: This function violates the object-oriented principle of modularity. However, it might be useful when you need to perform expensive initialization only if something is connected to a signal.

void QObject:: removeEventFilter ( QObject * obj )

Removes an event filter object obj from this object. The request is ignored if such an event filter has not been installed.

All event filters for this object are automatically removed when this object is destroyed.

It is always safe to remove an event filter, even during event filter activation (i.e. from the eventFilter() function).

QObject * QObject:: sender () const [protected]

Returns a pointer to the object that sent the signal, if called in a slot activated by a signal; otherwise it returns 0. The pointer is valid only during the execution of the slot that calls this function from this object’s thread context.

The pointer returned by this function becomes invalid if the sender is destroyed, or if the slot is disconnected from the sender’s signal.

Warning: This function violates the object-oriented principle of modularity. However, getting access to the sender might be useful when many signals are connected to a single slot.

Warning: As mentioned above, the return value of this function is not valid when the slot is called via a Qt::DirectConnection from a thread different from this object’s thread. Do not use this function in this type of scenario.

void QObject:: setParent ( QObject * parent )

Makes the object a child of parent.

bool QObject:: setProperty ( const char * name, const QVariant & value )

Sets the value of the object’s name property to value.

If the property is defined in the class using Q_PROPERTY then true is returned on success and false otherwise. If the property is not defined using Q_PROPERTY, and therefore not listed in the meta-object, it is added as a dynamic property and false is returned.

Information about all available properties is provided through the metaObject() and dynamicPropertyNames().

Dynamic properties can be queried again using property() and can be removed by setting the property value to an invalid QVariant. Changing the value of a dynamic property causes a QDynamicPropertyChangeEvent to be sent to the object.

Note: Dynamic properties starting with «_q_» are reserved for internal purposes.

bool QObject:: signalsBlocked () const

Returns true if signals are blocked; otherwise returns false.

Signals are not blocked by default.

int QObject:: startTimer ( int interval )

Starts a timer and returns a timer identifier, or returns zero if it could not start a timer.

A timer event will occur every interval milliseconds until killTimer() is called. If interval is 0, then the timer event occurs once every time there are no more window system events to process.

The virtual timerEvent() function is called with the QTimerEvent event parameter class when a timer event occurs. Reimplement this function to get timer events.

If multiple timers are running, the QTimerEvent::timerId() can be used to find out which timer was activated.

Note that QTimer’s accuracy depends on the underlying operating system and hardware. Most platforms support an accuracy of 20 milliseconds; some provide more. If Qt is unable to deliver the requested number of timer events, it will silently discard some.

The QTimer class provides a high-level programming interface with single-shot timers and timer signals instead of events. There is also a QBasicTimer class that is more lightweight than QTimer and less clumsy than using timer IDs directly.

QThread * QObject:: thread () const

Returns the thread in which the object lives.

void QObject:: timerEvent ( QTimerEvent * event ) [virtual protected]

This event handler can be reimplemented in a subclass to receive timer events for the object.

QTimer provides a higher-level interface to the timer functionality, and also more general information about timers. The timer event is passed in the event parameter.

QString QObject:: tr ( const char * sourceText, const char * disambiguation = 0, int n = -1 ) [static]

Returns a translated version of sourceText, optionally based on a disambiguation string and value of n for strings containing plurals; otherwise returns sourceText itself if no appropriate translated string is available.

If the same sourceText is used in different roles within the same context, an additional identifying string may be passed in disambiguation (0 by default). In Qt 4.4 and earlier, this was the preferred way to pass comments to translators.

See Writing Source Code for Translation for a detailed description of Qt’s translation mechanisms in general, and the Disambiguation section for information on disambiguation.

Warning: This method is reentrant only if all translators are installed before calling this method. Installing or removing translators while performing translations is not supported. Doing so will probably result in crashes or other undesirable behavior.

QString QObject:: trUtf8 ( const char * sourceText, const char * disambiguation = 0, int n = -1 ) [static]

Returns a translated version of sourceText, or QString::fromUtf8(sourceText) if there is no appropriate version. It is otherwise identical to tr(sourceText, disambiguation, n).

Note that using the Utf8 variants of the translation functions is not required if CODECFORTR is already set to UTF-8 in the qmake project file and QTextCodec::setCodecForTr(«UTF-8») is used.

Warning: This method is reentrant only if all translators are installed before calling this method. Installing or removing translators while performing translations is not supported. Doing so will probably result in crashes or other undesirable behavior.

Warning: For portability reasons, we recommend that you use escape sequences for specifying non-ASCII characters in string literals to trUtf8(). Например:

Описание типов

const QMetaObject QObject:: staticMetaObject

This variable stores the meta-object for the class.

A meta-object contains information about a class that inherits QObject, e.g. class name, superclass name, properties, signals and slots. Every class that contains the Q_OBJECT macro will also have a meta-object.

The meta-object information is required by the signal/slot connection mechanism and the property system. The inherits() function also makes use of the meta-object.

If you have a pointer to an object, you can use metaObject() to retrieve the meta-object associated with that object.

Связанные нечлены класса

typedef QObjectList

T qFindChild ( const QObject * obj, const QString & name )

This function is equivalent to obj->findChild (name). It is provided as a work-around for MSVC 6, which doesn’t support member template functions.

QList T > qFindChildren ( const QObject * obj, const QString & name )

This function is equivalent to obj->findChildren (name). It is provided as a work-around for MSVC 6, which doesn’t support member template functions.

QList T > qFindChildren ( const QObject * obj, const QRegExp & regExp )

This function overloads qFindChildren().

This function is equivalent to obj->findChildren (regExp). It is provided as a work-around for MSVC 6, which doesn’t support member template functions.

T qobject_cast ( QObject * object )

Returns the given object cast to type T if the object is of type T (or of a subclass); otherwise returns 0. If object is 0 then it will also return 0.

The class T must inherit (directly or indirectly) QObject and be declared with the Q_OBJECT macro.

A class is considered to inherit itself.

The qobject_cast() function behaves similarly to the standard C++ dynamic_cast(), with the advantages that it doesn’t require RTTI support and it works across dynamic library boundaries.

qobject_cast() can also be used in conjunction with interfaces; see the Plug & Paint example for details.

Warning: If T isn’t declared with the Q_OBJECT macro, this function’s return value is undefined.

Описание макросов


Q_CLASSINFO ( Name, Value )

This macro associates extra information to the class, which is available using QObject::metaObject(). Except for the ActiveQt extension, Qt doesn’t use this information.

The extra information takes the form of a Name string and a Value literal string.

Q_DISABLE_COPY ( Class )

Disables the use of copy constructors and assignment operators for the given Class.

Instances of subclasses of QObject should not be thought of as values that can be copied or assigned, but as unique identities. This means that when you create your own subclass of QObject (director or indirect), you should not give it a copy constructor or an assignment operator. However, it may not enough to simply omit them from your class, because, if you mistakenly write some code that requires a copy constructor or an assignment operator (it’s easy to do), your compiler will thoughtfully create it for you. You must do more.

The curious user will have seen that the Qt classes derived from QObject typically include this macro in a private section:

It declares a copy constructor and an assignment operator in the private section, so that if you use them by mistake, the compiler will report an error.

But even this might not catch absolutely every case. You might be tempted to do something like this:

First of all, don’t do that. Most compilers will generate code that uses the copy constructor, so the privacy violation error will be reported, but your C++ compiler is not required to generate code for this statement in a specific way. It could generate code using neither the copy constructor nor the assignment operator we made private. In that case, no error would be reported, but your application would probably crash when you called a member function of w.

Q_EMIT

Use this macro to replace the emit keyword for emitting signals, when you want to use Qt Signals and Slots with a 3rd party signal/slot mechanism.

The macro is normally used when no_keywords is specified with the CONFIG variable in the .pro file, but it can be used even when no_keywords is not specified.

Q_ENUMS ( . )

This macro registers one or several enum types to the meta-object system.

If you want to register an enum that is declared in another class, the enum must be fully qualified with the name of the class defining it. In addition, the class defining the enum has to inherit QObject as well as declare the enum using Q_ENUMS().

Q_FLAGS ( . )

This macro registers one or several flags types to the meta-object system. It is typically used in a class definition to declare that values of a given enum can be used as flags and combined using the bitwise OR operator.

For example, in QLibrary, the LoadHints flag is declared in the following way:

The declaration of the flags themselves is performed in the public section of the QLibrary class itself, using the Q_DECLARE_FLAGS() macro:

Note: This macro takes care of registering individual flag values with the meta-object system, so it is unnecessary to use Q_ENUMS() in addition to this macro.

Q_INTERFACES ( . )

This macro tells Qt which interfaces the class implements. This is used when implementing plugins.

See the Plug & Paint Basic Tools example for details.

Q_INVOKABLE

Apply this macro to definitions of member functions to allow them to be invoked via the meta-object system. The macro is written before the return type, as shown in the following example:

The invokableMethod() function is marked up using Q_INVOKABLE, causing it to be registered with the meta-object system and enabling it to be invoked using QMetaObject::invokeMethod(). Since normalMethod() function is not registered in this way, it cannot be invoked using QMetaObject::invokeMethod().

Q_OBJECT

The Q_OBJECT macro must appear in the private section of a class definition that declares its own signals and slots or that uses other services provided by Qt’s meta-object system.

Note: This macro requires the class to be a subclass of QObject. Use Q_GADGET instead of Q_OBJECT to enable the meta object system’s support for enums in a class that is not a QObject subclass. Q_GADGET makes a class member, staticMetaObject, available. staticMetaObject is of type QMetaObject and provides access to the enums declared with Q_ENUMS. Q_GADGET is provided only for C++.

Q_PROPERTY ( . )

This macro is used for declaring properties in classes that inherit QObject. Properties behave like class data members, but they have additional features accessible through the Meta-Object System.

The property name and type and the READ function are required. The type can be any type supported by QVariant, or it can be a user-defined type. The other items are optional, but a WRITE function is common. The attributes default to true except USER, which defaults to false.

For more details about how to use this macro, and a more detailed example of its use, see the discussion on Qt’s Property System.

Q_SIGNAL

This is an additional macro that allows you to mark a single function as a signal. It can be quite useful, especially when you use a 3rd-party source code parser which doesn’t understand a signals or Q_SIGNALS groups.

Use this macro to replace the signals keyword in class declarations, when you want to use Qt Signals and Slots with a 3rd party signal/slot mechanism.

The macro is normally used when no_keywords is specified with the CONFIG variable in the .pro file, but it can be used even when no_keywords is not specified.

Q_SIGNALS

Use this macro to replace the signals keyword in class declarations, when you want to use Qt Signals and Slots with a 3rd party signal/slot mechanism.

The macro is normally used when no_keywords is specified with the CONFIG variable in the .pro file, but it can be used even when no_keywords is not specified.

Q_SLOT

This is an additional macro that allows you to mark a single function as a slot. It can be quite useful, especially when you use a 3rd-party source code parser which doesn’t understand a slots or Q_SLOTS groups.

Use this macro to replace the slots keyword in class declarations, when you want to use Qt Signals and Slots with a 3rd party signal/slot mechanism.

The macro is normally used when no_keywords is specified with the CONFIG variable in the .pro file, but it can be used even when no_keywords is not specified.

Q_SLOTS

Use this macro to replace the slots keyword in class declarations, when you want to use Qt Signals and Slots with a 3rd party signal/slot mechanism.

The macro is normally used when no_keywords is specified with the CONFIG variable in the .pro file, but it can be used even when no_keywords is not specified.

Все остальные торговые марки являются собственностью их владельцев. Политика конфиденциальности

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

Кроме того, этот документ может быть использован в соответствии с условиями GNU Free Documentation License version 1.3, опубликованной фондом Free Software Foundation.

Доклад: Путешествуя по TObject. Или как оно работает

Каждый класс в Delphi является наследником TObject, и, соответственно, обладает всеми его свойствами и методами. Это, несомненно, полезный факт, но каковы его методы и свойства, каковы его основные свойства и как их можно использовать? Как мы увидим немного позже, очень многое в реализации TObject направлено на описание объектной модели Delphi.

Рассмотрим его описание поподробнее.

class function InitInstance(Instance: Pointer): TObject;

function ClassType: TClass;

class function ClassName: ShortString;

class function ClassNameIs(const Name: string): Boolean;

class function ClassParent: TClass;

class function ClassInfo: Pointer;

class function InstanceSize: Longint;

class function InheritsFrom(AClass: TClass): Boolean;

class function MethodAddress(const Name: ShortString): Pointer;

class function MethodName(Address: Pointer): ShortString;

function FieldAddress(const Name: ShortString): Pointer;

function GetInterface(const IID: TGUID; out Obj): Boolean;

class function GetInterfaceEntry(const IID: TGUID): PInterfaceEntry;

class function GetInterfaceTable: PInterfaceTable;

function SafeCallException(ExceptObject: TObject;

ExceptAddr: Pointer): HResult; virtual;

procedure AfterConstruction; virtual;

procedure BeforeDestruction; virtual;

procedure Dispatch(var Message); virtual;

procedure DefaultHandler(var Message); virtual;

class function NewInstance: TObject; virtual;

procedure FreeInstance; virtual;

destructor Destroy; virtual;

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

Сразу хочу оговориться, методы — конструкторы и деструкторы на самом деле являются операторами, то есть внутренними, не зависящими от их реализации в коде, конструкциями.

Все объекты создаются посредством вызова конструктора. Собственно конструктор не обязан называться Create, просто это принятое название данного метода. Конструктор на самом деле является методом класса, и в процессе его работы вызываются следующие методы:

На самом деле вызов этих методов происходит достаточно интересно. В TObject конструктор не выполняет никакой деятельности, однако, как корневой класс иерархии он создается на уровне RTM. Что же происходит? После вызова конструктора RTM вызывает метод NewInstance, который выделяет область в памяти, согласуясь при этом со значением vmtInstanceSize, которое формируется при компиляции. В рамках вызова NewInstance выполняется вызов InitInstance, который заполняет поля метода значениями, обозначенными в модификаторах default, далее выполняется код, описанный в теле процедуры Create (или той, что заявлена в качестве конструктора), после чего управление передается в точку, определенную в точке vmtAfterConstruction, которая по умолчанию указывает на метод AfterConstruction. Все эти манипуляции позволяют максимально упростить процесс гибкого создания экземпляра класса в рамках объектной модели Delphi. Таким образом, при создании экземпляра класса (объекта) вы можете «поприсутствовать» на любой его фазе. Смысл процедуры AfterConstruction состоит в том, чтобы выявить момент окончания конструирования класса. Удобство его использования состоит в том, что он вызывается только при удачном выполнении конструктора, что, сами понимаете достаточно выгодно. На сегодняшний момент только TCustomForm и TCustomDataModule перегружают этот метод специально для того, чтобы выполнить специфичные для них функции, так что мешает нам сделать то же самое? Но это уже вопрос конструирования класса.

Что же произойдет при возникновении исключительной ситуации в рамках конструктора? Здесь важно знать о том, что все элементы класса уже созданы и при возникновении исключительной ситуации мы знаем, что можно удалить. Так вот при возникновении исключения вызываются все действия, связанные с разрушением — вызов деструктора, все по полной программе.

Важно знать, что при вызове конструктора класса он вызывается как конструктор и создает экземпляр, при вызове же конструктора у объекта он вызывается как процедура и нового экземпляра не создает, отсюда получают свое начало ошибки следующего рода:

O.Create; // Неверный вызов

O := TObject.Create; // Корректный вызов

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

Эта процедура инициирует процесс разрушения объекта в памяти. Почему же не деструктор? Вызов деструктора является корректным освобождением ресурсов для устаревшего способа определения объектов object. Если же посмотреть на то, каким образом работает эта процедура, то можно увидеть интереснейшую картину.

CALL dword ptr [ECX].vmtDestroy

Что же мы видим? В первой строке происходит сверка указателя на Self (себя) с нулем — а не освободили ли нас уже? Если еще нет, то соответственно указателю на vmtDestroy мы вызываем реальный деструктор. В противном случае происходит выход из процедуры. Таким образом происходит тривиальная «проверка на дурака» со стороны RTM Delphi. При вызове же деструктора мы непосредственно освобождаем (или не освобождаем, а зря) ресурсы объекта. Опять же при освобождении ресурсов выполняется полный набор действий.

Метод FreeInstance вызывает каскад процедур, направленных на освобождение всех захваченных ресурсов, в том числе и динамических массивов, Variant типов и многого другого. Это должно быть полезно при возникновении исключительных ситуациях в конструкторе при уже созданных внутренних динамических структурах. Это также весьма полезно как механизм сбора мусора внутри объекта.

class function InitInstance(Instance: Pointer): TObject;

Функция инициализации экземпляра информацией из VMT, при этом учитывается использование интерфейсов при наследовании. Важно обратить внимание на то, что это функция класса, фактически эта функция заполняет болванку объекта, созданную функцией NewInstance.

Процедура возврата экземпляра к «девственному» содержанию. При этом используются информация, хранящаяся в vmtInitTable и в vmtParent.

Function ClassType: TClass;

Возвращает класс объекта. А если быть более точным, то возвращается непосредственно указатель на VMT.

class function ClassName: ShortString;

Возвращает название класса. Используется VMT.

class function ClassNameIs(const Name: string): Boolean;

Выполняет сверку названия с названием необходимого класса. Используется при выполнении оператора is.

class function ClassParent: TClass;

Отдает указатель на родительский класс. Используется при выполнении оператора is.

class function ClassInfo: Pointer;

Возвращает указатель на RTTI информацию о классе. Если класс скомпилирован без использования директивы $M+, то возвращается nil.

class function InstanceSize: Longint;

Размер экземпляра. Как видно из описания информация о размере и о RTTI хранится в VMT вне привязки к конкретному экземпляру. Судя по всему, эта информация формируется во время компиляции.

class function InheritsFrom(AClass: TClass): Boolean;

Возвращает точное указание на то, что данный класс унаследован от искомого. Эта функция сканирует VMT и родителей этого VMT на соответствие указанному классу.

class function MethodAddress(const Name: ShortString): Pointer;

Сканирует VMT на наличие метода и при удачном результате возвращает указатель но него. При не нахождении метода в «родной» VMT сканируется VMT родителя и так до тех пор, пока не будет найден (или не найден) адрес метода. Таким образом осуществляется реализация метаморфизма в объектной модели Delphi.

class function MethodName(Address: Pointer): ShortString;

Функция обратна предыдущей.

Function FieldAddress(const Name: ShortString): Pointer;

Доступ к полям. Возвращает указатель на поле. Как всегда использует VMT.

Function GetInterface(const IID: TGUID; out Obj): Boolean;

Используется при наследовании интерфейсов и возвращает интерфейс указываемого IID.

class function GetInterfaceEntry(const IID: TGUID): PinterfaceEntry;

Возвращает точку входа интерфейса на указанный IID.

class function GetInterfaceTable: PInterfaceTable;

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

Function SafeCallException(ExceptObject: TObject; ExceptAddr: Pointer): HResult; virtual;

Безопасная обработка прерывания, однако, использование этого метода непосредственно в TObject вернет Вам E_UNEXPECTED, то есть что-то неожиданное. Вызывается каждый раз при возникновении исключения внутри кода объекта с указанием на объект исключения и адрес, вызвавший исключение.

Procedure AfterConstruction; virtual;

Процедура, вызываемая после создания экземпляра. Вызов процедуры осуществляется по адресу, прописанному в VMT. Прямой вызов нигде не прописан, судя по всему, эта возможность прописана в RTM, где указаны все вызовы.

Procedure BeforeDestruction; virtual;

Процедура, вызываемая до разрушения объекта.

Procedure Dispatch(var Message); virtual;

Вследствие использования Windows в качестве базовой платформы разработчики решили не проходить мимо основного способа обработки межобъектного взаимодействия — системы сообщений. Этот способ как раз и реализуется этим методом. Весьма разумно было поместить его именно в TObject, ведь он является базовым для всех классов, определенных в рамках объектной модели Delphi. Этот метод сканирует VMT на наличие обработчика сообщения, ID которого указан в первых 4 байтах (длинное слово,Cardinal) параметра Message и если не находит, то вызывает DefaultHandler. То есть можно отлавливать события, происходящие не только у элементов управления, но и у классов низшей иерархии.

Procedure DefaultHandler(var Message); virtual;

Обработчик событий по умолчанию. Вызывается методом Dispatch при не нахождении метода-обработчика соответствующего сообщения.

class function NewInstance: TObject; virtual;

Создает экземпляр класса. Разумно использовать эту функцию для клонирования объектов, так как, не зная исходного класса, можно создавать новые экземпляры уже готовых объектов без использования RTTI.

procedure FreeInstance; virtual;

Освобождает ресурсы экземпляра. Использование этого метода не приветствуется по причине его тесной взаимосвязи с VMT, то есть перегрузка этого метода должна производиться с большой осторожностью. Вызов же метода напрямую в совокупности с InitInstance может служить для того, чтобы создать экземпляр «в себе», ведь некоторые задачи требуют отката состояния объекта на момент создания.

destructor Destroy; virtual;

Собственно деструктор. Вызывается методом Free после удостоверения в том, что экземпляр пока существует. Есть одно замечание по поводу именования деструктора — он должен называться Destroy, это связано с его виртуальностью, а соответственно и перегрузкой. Если Вы назовете деструктор другим именем, то при попытке вызвать унаследованный метод RTM не найдет описание метода с вашим именем, а это повлечет за собой нарушение функциональности процедуры разрушения объекта. Однако интересно отметить одну деталь. Наличие вызова унаследованного деструктора не обязательно, хотя и желательно — ведь не все разработчики любят обрабатывать события времени исполнения, а освобождение памяти, отведенной под экземпляр, произойдет без участия кода, описанного в деструкторе.

Давая описание методам базового класса TObject, я пытался дать представление об объектной модели Delphi, о жизненном цикле объекта, о методах использования объектов в собственных программах и правилах перегрузки. Как видно из вышесказанного основой для работы с экземплярами является VMT, и использование RTTI не всегда необходимо для выполнения некоторых специфических операций с экземпляром. Использование же RTTI, на мой взгляд, не всегда оправдывается, однако при написании RunTime редакторов компонент это средство достаточно удобно.

В результате изучения исходного кода обнаружился интереснейший момент — при вызове любого метода в EAX находится указатель … на VMT! Не это ли является явным указанием на объектную ориентированность Delphi?! Изучая материалы книги «Delphi in nutshell» Рэя Лишнера (Ray Lischner) я наткнулся на интересный факт — таблицу сравнения объектных моделей некоторых языков, позволю себе привести ее с некоторым переводом и дополнениями:

Поддерживаемые возможности объектных моделей некоторых языков программирования.

Возможность Delphi C++ Java Visual Basic
Наследование + + +
Множественное наследование +
Интерфейсы + Как чисто абстрактные классы + +
Один базовый класс + +
Метаклассы + +
Статические поля классов Как поля модуля + +
Виртуальные методы + + +
Абстрактные методы + + +
Статические методы классов + + +
Динамические методы +
Сбор мусора Интерфейсные методы и динамические деструкторы + Интерфейсные методы
Типы Variant + +
OLE automation + +
Статический контроль типов + + +
Обработка исключений + + + +
Перегрузка методов + + +
Полиморфные вызовы + +
Перегрузка операторов +
Методы — не члены класса + + +
Переменные — не члены объекта + + +
Свойства + +
RTTI + Только для операторов is и as +
Общие типы (шаблоны) +
Поддержка нитей + +
Обработка сообщений +
Встроенный ассемблер + В некоторых реализациях +
Inline функции +
Пакеты + +
Друзья класса Модульная видимость + Пакетная видимость

Тут видны некоторые особенности, которые не очевидны на первый взгляд. Что же такое динамические методы? Сразу стоит оговориться — это модификатор способа вызова метода, и по этому его сразу надо поставить в один ряд с другими способами вызова методов — статическими, виртуальными и репредставительными. Чем же они отличаются и когда они нужны?

Статические методы (их аналог в Java — final, финальные) являются не перегружаемыми методами, их функциональность окончательна, например конструктор Create класса TObject — он пуст и никакой дополнительной деятельности не несет, по этому вызов этого метода не полиморфен. По этому, если вы хотите перегрузить статический метод, то Вам придется заново описывать всю его функциональность.

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

Метод Ссылка
DoOne Self.DoOne
DoTwo Self.Parent.DoTwo
DoThree Self.Parent.Parent.DoThree

Чтобы быть полностью точным, надо сказать, что в таблице указаны все виртуальные методы, определенные в родителях плюс внутри самого класса. Если есть перегруженные методы, то в таблице на соответствующих местах ставятся входные точки новых методов, если же нет — то входные точки методов родителей. Таким образом, можно точно сказать, какой метод надо вызывать при обращении к таблице виртуальных методов.

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

Репредствавительные методы это методы, функциональность которых переопределена полностью относительно родителя. Вообще-то указание директивы reintroduce не обязательно, но это избавит Вас от лишнего предупреждения о перегрузке метода со стороны компилятора.

Еще одна интересная особенность TObject — это хранение на уровне VMT информации о трех методах с интересным названием: QueryInterface, AddRef и Release. То есть любой класс, созданный в рамках объектной модели Delphi является COM объектом! Единственным ограничением здесь является то, что для функционирования этих методов необходимо унаследовать хотя бы один интерфейс, что и сделано в рамках другого базового класса TInterfacedObject.

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

Конструктор Create класса TObject.

Выполняет общие стандартные действия по созданию объектов.

1. Выделяет память для объекта с помощью использования метода newInstance класса TObject, который в свою очередь вызывает метод InstanceSize(метод класса TObject) для определения размера памяти, требуемого для данного объекта.

2. Инициализирует поля созданного объекта нулевыми значениями с помощью метода InitInstance класса TObject.

Конструктор Create класса TObject объявлен статическим и не содержит параметров, но в некоторых классах он переопределяется.

Constructor Create (AOwner:TComponent);virtual;

Деструктор Destroy класса TObject.

Выполняет общие стандартные действия по уничтожению объекта с помощью метода FreeInstance класса. TObject, который в свою очередь вызывает метод CleanUpInstance.для корректного завершения работы со сложными структурами данных

Вызывает метод InstanceSize для определения размера памяти, занимаемого удаляемым объектом.

Деструктор Destroy в классе TObject виртуальный, если в производных классах он переопределяется, необходимо использовать директиву override.

Одним из аргументов обработчика событий обычно яляется параметр Sender, имеющий тип TObject. Фактические это означает что Sender может принадлежать любому классу. Таким образом недостатком является то, что неизвестно, к какому именно классу принадлежит данный объект.

Проблема решается при помощи механизмов RTTI или при помощи методов класса TObject.

Procedure …………….. (sender: TObject)

If Sender is TButton

Сущевует и доругой подход, в отнощении любого объекта можно использовать методы, определенные в ….. TObject.

Например, метод ClassName возвращает строку, возвращающую имя класса. Это классовый метод, поэтому его можно применят как в отнощении объекта, так и в отношении класса.

Результат будет одинаковый.

Бывают ситуации когда необходимо получить имя класса, но чаще требуется получить ссылку на сам класс или на его базовый класс. Ссылка на класс позволяет выполнять операции в отношении класса в процессе выполнения программы. А имя класса это всего лишь строка символов.

Ссылку на класс можно получить при помощи методов:

ClassParent // родительский класс

Получив ссылку на класс можно использовать в отношении неё любой из методов класса TObject.

InstanceSize отличается от функции SizeOf.

sizeOf к любому объекту вернет 4 байта, т.к. переменная в Обжект паскале всего лишь ссылка, а объекты динамические на самом деле.

Метод InstanceSize возвращает размер объекта в процессе выполнения программы(не путать с функцией sizeOf, которая возвращает размер ссылки на объект, т.е. 4 байта).

Метод ClassInfo возвращает указать на внутреннюю информацию RTTI.

Пример того, как методы класса TObject можно использовать для получения инфы о классе.

Procedure TSenderForm.ShowSender (Sender:TObject);

If sender.ClassParent <> nil then

Данный метод соединен с событием onClick нескольких элементов управления.

Баттон 1 Едит1 ЧекБокс поле

События.

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

События – это не в полнее новый механизм, т.к. технически события это свойство, которое в отличии от других свойств ссылается не на данные а на методы. Т.е. событие – это свойство типа “указатель на метод”.

События в Дельфи генерируются, например, в следующих случаях, например, когда пользователь воздействует на компонент (щелкает мышкой).

Порождается в ответ на вызов метода или на изменение свойств компонента(если установить фокус ввода на один компонент, то компонент, на котором фокус ввода был до этого теряет его, инициируя соответствующее событие).

Большинство событий в Дельфи инициируется при получении соответствующего сообщения Windows, хотя событие и не образует взаимно-однозначного соответствия с этими сообщения.

Сообщение – это извещение о некотором месте событии, посылаемом в систему Windows в адрес пользователя. Любые действия пользователя – щелчок мыши, изменение размеров окна приложения – вынуждают Windows отправить приложению сообщение.

Сообщение – это определенная запись, передаваемая приложению. Она содержит сведения о том, что произошло в системе, а также дополнительную информацию, зависящую от типа сообщения. Система сообщений Windows состоит из трех компонентов,:

1)-очередь сообщений (отдельная для каждого приложения)

Приложение получает сообщения из очереди и передает их соответствующему окну.

Группа циклически выполняемых операторов приложения, осуществляющих выборку сообщений из очереди и передачу их соответствующему окну для обработки.

Каждое окно приложения имеет собственную процедуру, которая получает все передаваемые окну сообщения, в ответ она должна выполнить определенные действия.

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

В отличии от событий в Дельфи, обработка сообщений является обязательной и не может выполняться или не выполняться по усмотрению программиста.

Система событий дельфи представляет собой интерфейс для взаимодействия с сообщениями Windows (с некоторой их частью). Многие события компонентов непосредственно связаны с сообщениями Windows, кроме того Дельфи генерирует ряд дополнительных межкомпонентных сообщений.

С теоретической точки зрения , событие – это результат запроса, посланного компоненту или элементу управления, при этом компонент или элемент управления может ответить на это сообщение.

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

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

Дата добавления: 2020-07-27 ; просмотров: 619 ; ЗАКАЗАТЬ НАПИСАНИЕ РАБОТЫ

Лекция 14. ООП (Классы. — глава из учебника [3])

3.5.1 Объявление класса

Класс — это тип данных, определяемый пользователем. То, что в Delphi имеется множество предопределенных классов, не противоречит этому определению -ведь разработчики Delphi тоже пользователи Object Pascal.

Класс должен быть объявлен до того, как будет объявлена хотя бы одна переменная этого класса. Т.е. класс не может объявляться внутри объявления переменной.

В любом вашем Делфи-приложении вы можете увидеть строки:

Это объявление класса TForml вашей формы и объявление переменной Forml -объекта этого класса.

В общем случае синтаксис объявления класса следующий:

Имя класса может быть любым допустимым идентификатором. Но принято идентификаторы большинства классов начинать с символа «Т». Имя класса — родителя может не указываться. Тогда предполагается, что данный класс является непосредственным наследником TObject — наиболее общего из предопределенных классов. Таким образом, эквивалентны следующие объявления: В приведенном ранее объявлении класса формы TForml видно, что его родительским классом является класс TForm.

Класс наследует поля, методы, свойства, события от своих предков и может отменять какие-то из этих элементов класса или вводить новые. Доступ к объявляемым элементам класса определяется тем, в каком разделе они объявлены.

Раздел public (открытый) предназначен для объявлений, которые доступны для внешнего использования. Это открытый интерфейс класса. Раздел published (публикуемый) содержит открытые свойства, которые появляются в процессе проектирования на странице свойств Инспектора Объектов и которые, следовательно, пользователь может устанавливать в процессе проектирования. Раздел private (закрытый), содержит объявления полей, процедур и функций, используемых только внутри данного класса. Раздел protected (защищенный) содержит объявления, доступные только для потомков объявляемого класса. Как и в случае закрытых элементов, можно скрыть детали реализации защищенных элементов от конечного пользователя. Однако в отличие от закрытых, защищенные элементы остаются доступны для программистов, которые захотят производить от этого класса производные объекты, причем не требуется, чтобы производные объекты объявлялись в этом же модуле.

Объявления полей выглядят так же, как объявления переменных или объявления полей в записях:

В приведенном ранее объявлении класса формы вы можете видеть строку

Это объявление объекта (поля) Buttonl типа (класса) TButton.

Имеется одно очень существенное отличие объявления поля от обычного объявления переменной: в объявлении поля не разрешается его инициализация каким-то значением. Автоматически проводится стандартная инициализация: порядковым типам в качестве начального значения задается 0, указателям — nil, строки задаются пустыми. При необходимости задания других начальных значений используются конструкторы, описанные далее в разд. 3.5.3.

Объявления методов в простейшем случае также не отличаются от обычных объявлений процедур и функций.

3.5.2 Свойства

Поля данных, исходя из принципа инкапсуляции — одного из основополагающих в объектно-ориентированном программировании, всегда должны быть защищены от несанкционированного доступа. Доступ к ним, как правило, должен осуществляться только через свойства, включающие методы чтения и записи полей. Поэтому поля целесообразно объявлять в разделе private — закрытом разделе класса. В редких случаях их можно помещать в protected — защищенном разделе класса, чтобы возможные потомки данного класса имели к ним доступ. Традиционно идентификаторы полей совпадают с именами соответствующих свойств, но с добавлением в качестве префикса символа F.

Свойство объявляется оператором вида:

Если в разделах read или write этого объявления записано имя поля, значит предполагается прямое чтение или запись данных (т.е. обмен данными непосредственно с полем).

Если в разделе read записано имя метода чтения, то чтение будет осуществляться только функцией с этим именем. Функция чтения — это функция без параметра, возвращающее значение того типа, который объявлен для свойства. Имя функции чтения принято начинать с префикса Get, после которого следует имя свойства.

Если в разделе write записано имя метода записи, то запись будет осуществляться только процедурой с этим именем. Процедура записи — это процедура с одним параметром того типа, который объявлен для свойства. Имя процедуры записи принято начинать с префикса Set, после которого следует имя свойства.

Если раздел write отсутствует в объявлении свойства, значит это свойство только для чтения и пользователь не может задавать его значение.

Директивы запоминания определяют, как надо сохранять значения свойств при сохранении пользователем файла формы .dfm. Чаще всего используется директива default — значение по умолчанию.
Она не задает начальные условия. Это дело конструктора. Директива просто говорит, что если пользователь в процессе проектирования не изменил значение свойства но умолчанию, то сохранять значение свойства не надо.

Приведем пример. Мы уже не раз использовали объекты, содержащие сведения о сотруднике некоторой организации. Но раньше мы реализовывали эти объекты в виде записей (см. разд. 3.3). А теперь рассмотрим более общий подход — реализацию класса подобных объектов.

Начните новый проект. Объявление класса, который мы хотим создать, можно поместить непосредственно в файл модуля. Но если вы хотите создать класс, который будете использовать в различных проектах, лучше оформить его в виде отдельного модуля unit, сохранить в каталоге своей библиотеки или библиотеки Delphi, и подключать в дальнейшем к различным проектам с помощью предложения uses. Если вы забыли, как создается отдельный модуль, не связанный с формой, и как он сохраняется в библиотеке, посмотрите все это в разд. 2.8.7.4. Мы выберем именно этот вариант. Так что выполните команду File | New | Unit (в некоторых более старых версиях Delphi — File | New и на странице New выберите пиктограмму Unit). Сохраните сразу этот ваш модуль в библиотеке под именем, например, MyClasses. А в модуль формы введите оператор, ссылающийся на этот модуль:

Теперь займемся созданием класса в модуле My > Вглядимся в приведенный код. Интерфейсный раздел модуля interface начинается с предложения uses. Заранее включать это предложение в модуль не требуется. Но по мере написания кода вы будете встречаться с сообщениями компилятора о неизвестных ему идентификаторах функций, типов и т.п. Столкнувшись с таким сообщением, надо посмотреть во встроенной справке Delphi или в справке [3], в каком модуле объявлена соответствующая функция или класс. И включить этот модуль в приложение uses.

Теперь обратимся к объявлению класса. Объявленный класс TPerson наследует непосредственно классу TObject, поскольку родительский класс не указан. В закрытом разделе класса private объявлен ряд полей. Поле FName предполагается использовать для фамилии, имени и отчества человека. Поля FDepl, FDep2, FDep3 будут использоваться под указание места работы или учебы. Поле FYear будет хранить год рождения, поле FSex — указание пола: символ «м» или «ж». Поле FAttr будет хранить какую-то характеристику: штатный — нештатный, отличник или нет и т.п. Поле FComment предназначено для каких-то текстовых комментариев. В частности, в нем можно хранить свойство Text многострочного окна редактирования Memo или RichEdit. Так что это может быть развернутая характеристика человека, правда, без форматирования.

В открытом разделе класса public объявлены свойства, соответствующие всем полям. Чтение всех свойств осуществляется непосредственно из полей. Запись во всех свойствах, кроме Sex, осуществляется тоже непосредственно в поля. А для поля Sex указана в объявлении свойства процедура записи SetSex, поскольку надо следить, чтобы по ошибке в это поле не записали символ, отличный от «м» и «ж». Соответственно в защищенном разделе класса protected содержится объявление этой процедуры. Как говорилось ранее, она должна принимать единственный параметр типа, совпадающего с типом свойства.

В раздел модуля implementation введена реализация процедуры записи SetSex. Ее заголовок повторяет объявление, но перед именем процедуры вводится ссылка на класс TPerson, к которому она относится. Не забывайте давать такие ссылки для методов класса. Иначе получите сообщение компилятора об ошибке; Unsatisfied forward or external declaration: TPerson.SetSex — нереализованная ранее объявленная или внешняя функция TPerson.SetSex.

Тело процедуры SetSex в особых комментариях не нуждается. В нем проверяется допустимость символа, переданного в процедуру через параметр Value. Если символ допустимый, то его значение заносится в поле FSex. Это поле, как и другие закрытые поля, открыто для методов данного класса. При ошибочном символе пользователю выдается сообщение об ошибке. Правда, лучше было бы в этом случае сгенерировать исключение, но пока мы не обсуждали, как это можно делать.

Вы создали класс в вашем модуле MyClasses. Давайте посмотрим, как можно использовать объекты нашего класса. Создайте в модуле формы Unit1 вашего приложения тест класса TPerson. Введите в модуль операторы:

uses Classl;
var Pers: TPerson;

Они обеспечивают связь с модулем, описывающим класс, и объявляют переменную Pers, через которую вы будете связываться с объектом класса. Но так же, как при работе с другими объектами и записями, объявление этой переменной еще не создает сам объект. Это указатель на объект, и его значение равно nil.

Создание объекта вашего класса TPerson должно осуществляться вызовом его конструктора Create. Так что создайте обработчик события OnCreate вашей формы, и вставьте в него оператор:

Вот теперь объект создан, и переменная Pers указывает на него. Чтобы не забыть очистить память от этого объекта при завершении работы приложения, сразу создайте обработчик события OnDestroy формы, и вставьте в него оператор:

Почему ваш объект воспринимает методы Create и Free? Ведь вы их не объявляли в классе TPerson! Это работает механизм наследования. В классе TObject, являющемся родительским для TPerson, методы Create и Free имеются. А поскольку вы их не перегружали, то ваш класс наследует их.

Теперь перенесите на форму четыре окна Edit, окно Memo и две кнопки. Пусть первая кнопка с надписью Запись заносит в объект Pers данные из окон редактирования: ‘ фамилию с именем и отчеством, пол, подразделение, в котором работает или обучается человек, год рождения, характеристику из окна Memo. Обработчик щелчка на ней может иметь вид:

А вторая кнопка с надписью Чтение пусть осуществляет чтение информации из объекта в окна редактирования. Обработчик щелчка на ней может иметь вид:

Выполните ваше приложение. Занесите в окна редактирования какую-то подходящую информацию и щелкните на кнопке Запись. А потом сотрите тексты всех окон редактирования и щелкните на кнопке Чтение. Информация в окнах должна восстановиться. Проверьте также реакцию на неверный символ, задающий пол.

Илон Маск рекомендует:  Быстрая сортировка
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL