Meta-object System

Мета-объектная система в 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 года.

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.