Meta-object System: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
 
(не показано 5 промежуточных версий 5 участников)
Строка 1: Строка 1:
{{main|Qt}}
{{main|Qt}}


'''Мета-объектная система''' в [[Qt|Qt framework]] предоставляет поддержку дополнительных возможностей в языке [[C++]], необходимое для интроспекции и рефлексии, предоставляя класс QObject с некоторым функционалом, как базовый. Фактически подавляющее большинство классов в Qt являются наследниками этого класса и реализуют данную систему.<ref>{{cite web|url=http://qt-project.org/doc/qt-5.1/qtcore/metaobjects.html|title=The Meta-Object System - QtCore 5.1|date=2013-07-04|publisher=Qt Project|accessdate=2013-07-04}}</ref>
'''Мета-объектная система''' в [[Qt|Qt framework]] предоставляет поддержку дополнительных возможностей в языке [[C++]], необходимое для интроспекции и рефлексии, предоставляя класс QObject с некоторым функционалом, как базовый. Фактически подавляющее большинство классов в Qt являются наследниками этого класса и реализуют данную систему.<ref>{{cite web|url=http://qt-project.org/doc/qt-5.1/qtcore/metaobjects.html|title=The Meta-Object System - QtCore 5.1|date=2013-07-04|publisher=Qt Project|accessdate=2013-07-04|archive-date=2013-08-26|archive-url=https://web.archive.org/web/20130826094334/http://qt-project.org/doc/qt-5.1/qtcore/metaobjects.html|deadlink=no}}</ref>


== Реализация ==
== Реализация ==
Строка 8: Строка 8:


# QObject является базовым классом для всех классов Qt
# QObject является базовым классом для всех классов Qt
# Мета-объектный компилятор предоставляет каждому подклассу QObject необходимый код на С++, для реализации мета-объектных возможностей, с учетом наличия или отсутствия макроса Q_OBJECT. Компилятор, не изменяет исходный файл, а создает другой содержащий метаобъектный код для каждого из этих классов.
# Мета-объектный компилятор предоставляет каждому подклассу QObject необходимый код на C++, для реализации мета-объектных возможностей, с учетом наличия или отсутствия макроса Q_OBJECT. Компилятор, не изменяет исходный файл, а создает другой содержащий метаобъектный код для каждого из этих классов.
# Макрос Q_OBJECT необходим мета-объектному компилятору. Находя данный макрос в исходном коде, компилятор объявляет некоторые функции, которые необходимы для анализа внутреннего состояния и должны быть реализованы в каждом подклассе ''QObject: metaObject(), tr(), qt_metacall()'' и некоторые другие.<ref>{{cite web|url=http://qt-project.org/doc/qt-5.1/qtdoc/moc.html|title=Using the Meta-Object Compiler (moc)|date=2013-07-04|publisher=Qt Project|accessdate=2013-07-04}}</ref>
# Макрос Q_OBJECT необходим мета-объектному компилятору. Находя данный макрос в исходном коде, компилятор объявляет некоторые функции, которые необходимы для анализа внутреннего состояния и должны быть реализованы в каждом подклассе ''QObject: metaObject(), tr(), qt_metacall()'' и некоторые другие.<ref>{{cite web|url=http://qt-project.org/doc/qt-5.1/qtdoc/moc.html|title=Using the Meta-Object Compiler (moc)|date=2013-07-04|publisher=Qt Project|accessdate=2013-07-04|archive-date=2013-08-26|archive-url=https://web.archive.org/web/20130826130735/http://qt-project.org/doc/qt-5.1/qtdoc/moc.html|deadlink=no}}</ref>


Допустимо использовать QObject в качестве базового класса и без макроса Q_OBJECT и без мета-объектного кода. Однако в таком случае, ни сигналы и слоты, ни другие возможности, описанные ниже, не будут доступны. С точки зрения метаобъектной системы, подкласс QObject без мета-кода аналогичен своему ближайшему предку с мета-объектным кодом. Это означает, что QMetaObject :: className () вернет не фактическое имя вашего класса, а имя класса этого предка.
Допустимо использовать QObject в качестве базового класса и без макроса Q_OBJECT и без мета-объектного кода. Однако в таком случае, ни сигналы и слоты, ни другие возможности, описанные ниже, не будут доступны. С точки зрения метаобъектной системы, подкласс QObject без мета-кода аналогичен своему ближайшему предку с мета-объектным кодом. Это означает, что QMetaObject :: className () вернет не фактическое имя вашего класса, а имя класса этого предка.


Макросы, используемые Мета-Объектным компилятором для аннотации кода — это стандартные макросы С++. Они должны быть корректно распознаны любым инструментом, способным анализировать код на С++. Добавляя макрос Q_OBJECT, программист дописывает объявление нескольких функций.
Макросы, используемые Мета-Объектным компилятором для аннотации кода — это стандартные макросы C++. Они должны быть корректно распознаны любым инструментом, способным анализировать код на C++. Добавляя макрос Q_OBJECT, программист дописывает объявление нескольких функций.


Класс QObject, при наличии макроса Q_OBJECT содержит в себе поддержку:
Класс QObject, при наличии макроса Q_OBJECT содержит в себе поддержку:


# Метаобъектной информации. Она включает в себя информацию о наследовании классов, что позволяет определять являются ли классы непосредственными наследниками, а так же узнать имя класса. Предоставляется и информация о мета-методах класса (сигналах, слотах и других вызывающихся функциях с макросом Q_INVOKABLE.
# Метаобъектной информации. Она включает в себя информацию о наследовании классов, что позволяет определять являются ли классы непосредственными наследниками, а так же узнать имя класса. Предоставляется и информация о мета-методах класса (сигналах, слотах и других вызывающихся функциях с макросом Q_INVOKABLE).
# Динамического приведения типов с помощью qobject_cast () для классов QObject . Функция qobject_cast () ведет себя аналогично стандартной C ++ <code>dynamic_cast()</code> с теми преимуществами, что она не требует поддержки RTTI и работает через границы динамических библиотек. Функция пытается привести свой аргумент к типу указателя, указанному в угловых скобках, возвращая ненулевой указатель, если объект имеет правильный тип (определенный во время выполнения), или <code>nullptr</code> , если тип объекта несовместим.
# Динамического приведения типов с помощью qobject_cast () для классов QObject . Функция qobject_cast () ведет себя аналогично стандартной C ++ <code>dynamic_cast()</code> с теми преимуществами, что она не требует поддержки RTTI и работает через границы динамических библиотек. Функция пытается привести свой аргумент к типу указателя, указанному в угловых скобках, возвращая ненулевой указатель, если объект имеет правильный тип (определенный во время выполнения), или <code>nullptr</code> , если тип объекта несовместим.
# Таймера, и соответственно цикл обработки событий. Дополнительно имеется механизм фильтрации, для перехвата данных событий.
# Таймера, и соответственно цикл обработки событий. Дополнительно имеется механизм фильтрации, для перехвата данных событий.
#Возможность интернационализации приложения с помощью методов QObject::tr() и QObject::trUtf8().
# Возможность интернационализации приложения с помощью методов QObject::tr() и QObject::trUtf8().
#Поддержку сигналов и слотов , которые используются для связи между слабо-связанными объектами.
# Поддержку сигналов и слотов , которые используются для связи между слабо-связанными объектами.
#Поддержка свойств, для получения информации об объектах Qt, не из С++ кода, например из QML или Qt Script.
# Поддержка свойств, для получения информации об объектах Qt, не из C++ кода, например из QML или Qt Script.


Использование мета-объектных систем прошло через некоторую критику. В документации Qt было дано несколько аргументов в пользу мета-объектных систем, включая плюсы генерации кода, динамичности графических интерфейсов, автоматической связи со скриптовыми языками, не добавляя ограничений и так же хорошая, производительность механизма сигналов и слотов в moc.<ref>{{cite web|url=http://qt-project.org/doc/qt-5.1/qtdoc/why-moc.html|title=Why Does Qt Use Moc for Signals and Slots?|date=2013-07-04|publisher=Qt Project|accessdate=2013-07-04|archive-date=2013-10-20|archive-url=https://web.archive.org/web/20131020085827/http://qt-project.org/doc/qt-5.1/qtdoc/why-moc.html|deadlink=no}}</ref> <ref>{{cite web|url=http://woboq.com/blog/moc-with-clang.html|title=Re-implementing Qt moc using libclang|date=2013-07-04|publisher=Olivier Goffart|accessdate=2013-07-04|archive-date=2013-07-15|archive-url=https://web.archive.org/web/20130715081749/http://woboq.com/blog/moc-with-clang.html|deadlink=no}}</ref>

Использование мета-объектных систем прошло через некоторую критику. В документации Qt было дано несколько вещей в пользу мета-объектных систем, включая плюсы генерации кода, динамичности графических интерфейсов, автоматической связи со скриптовыми языками, не добавляя ограничений и так же хорошая, производительная разработка механизма сигналов и слотов в moc.<ref>{{cite web|url=http://qt-project.org/doc/qt-5.1/qtdoc/why-moc.html|title=Why Does Qt Use Moc for Signals and Slots?|date=2013-07-04|publisher=Qt Project|accessdate=2013-07-04}}</ref> There are some efforts to make Qt needless of a preprocessor. These efforts include re-implementing Qt moc using libclang.<ref>{{cite web|url=http://woboq.com/blog/moc-with-clang.html|title=Re-implementing Qt moc using libclang|date=2013-07-04|publisher=Olivier Goffart|accessdate=2013-07-04}}</ref>


== Ссылки ==
== Ссылки ==
Строка 32: Строка 31:
{{Qt}}
{{Qt}}



[[Категория:Qt (software)]]
[[Категория:Qt]]

Текущая версия от 21:46, 18 сентября 2023

Мета-объектная система в Qt framework предоставляет поддержку дополнительных возможностей в языке C++, необходимое для интроспекции и рефлексии, предоставляя класс QObject с некоторым функционалом, как базовый. Фактически подавляющее большинство классов в Qt являются наследниками этого класса и реализуют данную систему.[1]

Реализация

[править | править код]

Мета-объектная система включает в себя: класс QObject, утилиту moc(Мета-Объектный Компилятор) и необязательный макрос Q_OBJECT.

  1. QObject является базовым классом для всех классов Qt
  2. Мета-объектный компилятор предоставляет каждому подклассу QObject необходимый код на C++, для реализации мета-объектных возможностей, с учетом наличия или отсутствия макроса Q_OBJECT. Компилятор, не изменяет исходный файл, а создает другой содержащий метаобъектный код для каждого из этих классов.
  3. Макрос Q_OBJECT необходим мета-объектному компилятору. Находя данный макрос в исходном коде, компилятор объявляет некоторые функции, которые необходимы для анализа внутреннего состояния и должны быть реализованы в каждом подклассе QObject: metaObject(), tr(), qt_metacall() и некоторые другие.[2]

Допустимо использовать QObject в качестве базового класса и без макроса Q_OBJECT и без мета-объектного кода. Однако в таком случае, ни сигналы и слоты, ни другие возможности, описанные ниже, не будут доступны. С точки зрения метаобъектной системы, подкласс QObject без мета-кода аналогичен своему ближайшему предку с мета-объектным кодом. Это означает, что QMetaObject :: className () вернет не фактическое имя вашего класса, а имя класса этого предка.

Макросы, используемые Мета-Объектным компилятором для аннотации кода — это стандартные макросы C++. Они должны быть корректно распознаны любым инструментом, способным анализировать код на C++. Добавляя макрос Q_OBJECT, программист дописывает объявление нескольких функций.

Класс QObject, при наличии макроса Q_OBJECT содержит в себе поддержку:

  1. Метаобъектной информации. Она включает в себя информацию о наследовании классов, что позволяет определять являются ли классы непосредственными наследниками, а так же узнать имя класса. Предоставляется и информация о мета-методах класса (сигналах, слотах и других вызывающихся функциях с макросом Q_INVOKABLE).
  2. Динамического приведения типов с помощью qobject_cast () для классов QObject . Функция qobject_cast () ведет себя аналогично стандартной C ++ dynamic_cast() с теми преимуществами, что она не требует поддержки RTTI и работает через границы динамических библиотек. Функция пытается привести свой аргумент к типу указателя, указанному в угловых скобках, возвращая ненулевой указатель, если объект имеет правильный тип (определенный во время выполнения), или nullptr , если тип объекта несовместим.
  3. Таймера, и соответственно цикл обработки событий. Дополнительно имеется механизм фильтрации, для перехвата данных событий.
  4. Возможность интернационализации приложения с помощью методов QObject::tr() и QObject::trUtf8().
  5. Поддержку сигналов и слотов , которые используются для связи между слабо-связанными объектами.
  6. Поддержка свойств, для получения информации об объектах Qt, не из C++ кода, например из QML или Qt Script.

Использование мета-объектных систем прошло через некоторую критику. В документации Qt было дано несколько аргументов в пользу мета-объектных систем, включая плюсы генерации кода, динамичности графических интерфейсов, автоматической связи со скриптовыми языками, не добавляя ограничений и так же хорошая, производительность механизма сигналов и слотов в moc.[3] [4]

  1. The Meta-Object System - QtCore 5.1. Qt Project (4 июля 2013). Дата обращения: 4 июля 2013. Архивировано 26 августа 2013 года.
  2. Using the Meta-Object Compiler (moc). Qt Project (4 июля 2013). Дата обращения: 4 июля 2013. Архивировано 26 августа 2013 года.
  3. Why Does Qt Use Moc for Signals and Slots? Qt Project (4 июля 2013). Дата обращения: 4 июля 2013. Архивировано 20 октября 2013 года.
  4. Re-implementing Qt moc using libclang. Olivier Goffart (4 июля 2013). Дата обращения: 4 июля 2013. Архивировано 15 июля 2013 года.