Метаобъектная	
  система	
  Qt	
  
Денис	
  Кормалев	
  
	
  
Москва,	
  2015	
  
Все,	
  что	
  мы	
  так	
  любим	
  
•  Сигнал-­‐слоты	
  
	
  
Все,	
  что	
  мы	
  так	
  любим	
  
•  Сигнал-­‐слоты	
  
•  Q_PROPERTY	
  
Все,	
  что	
  мы	
  так	
  любим	
  
•  Сигнал-­‐слоты	
  
•  Q_PROPERTY	
  
•  Связь	
  C++	
  и	
  QML	
  
Все,	
  что	
  мы	
  так	
  любим	
  
•  Сигнал-­‐слоты	
  
•  Q_PROPERTY	
  
•  Связь	
  C++	
  и	
  QML	
  
•  invokeMethod	
  
Все,	
  что	
  мы	
  так	
  любим	
  
•  Сигнал-­‐слоты	
  
•  Q_PROPERTY	
  
•  Связь	
  C++	
  и	
  QML	
  
•  invokeMethod	
  
•  QVariant	
  
	
  
Все,	
  что	
  мы	
  так	
  любим	
  
•  Сигнал-­‐слоты	
  
•  Q_PROPERTY	
  
•  Связь	
  C++	
  и	
  QML	
  
•  invokeMethod	
  
•  QVariant	
  
•  Работа	
  с	
  БД	
  
Все,	
  что	
  мы	
  так	
  любим	
  
•  Сигнал-­‐слоты	
  
•  Q_PROPERTY	
  
•  Связь	
  C++	
  и	
  QML	
  
•  invokeMethod	
  
•  QVariant	
  
•  Работа	
  с	
  БД	
  
Мета	
  система	
  
Подключение	
  
•  Наследник	
  от	
  QObject	
  
•  Макрос	
  Q_OBJECT	
  
Q_OBJECT	
  
moc	
  
•  Meta	
  Object	
  Compiler	
  
moc	
  
•  Meta	
  Object	
  Compiler	
  
•  Генерация	
  дополнительного	
  кода	
  перед	
  
сборкой	
  проекта	
  
moc	
  
•  Meta	
  Object	
  Compiler	
  
•  Генерация	
  дополнительного	
  кода	
  перед	
  
сборкой	
  проекта	
  
•  Обрабатываются	
  все	
  хедеры,	
  указанные	
  в	
  
headers	
  секции	
  
moc	
  
•  Meta	
  Object	
  Compiler	
  
•  Генерация	
  дополнительного	
  кода	
  перед	
  
сборкой	
  проекта	
  
•  Обрабатываются	
  все	
  хедеры,	
  указанные	
  в	
  
headers	
  секции	
  
•  Для	
  каждого	
  создается	
  файл	
  moc_myclass.cpp	
  
	
  
moc	
  
•  Meta	
  Object	
  Compiler	
  
•  Генерация	
  дополнительного	
  кода	
  перед	
  
сборкой	
  проекта	
  
•  Обрабатываются	
  все	
  хедеры,	
  указанные	
  в	
  
headers	
  секции	
  
•  Для	
  каждого	
  создается	
  файл	
  moc_myclass.cpp	
  
•  Чтобы	
  корректно	
  работали	
  классы	
  из	
  .cpp	
  
файлов	
  –	
  надо	
  в	
  конце	
  .cpp	
  файла	
  подключить	
  
myclass.moc	
  
QMetaObject	
  
•  Имя	
  класса	
  
	
  
	
  
QMetaObject	
  
•  Имя	
  класса	
  
•  Методы	
  
	
  
QMetaObject	
  
•  Имя	
  класса	
  
•  Методы	
  
•  Свойства	
  
QMetaObject	
  
•  Имя	
  класса	
  
•  Методы	
  
•  Свойства	
  
•  Енамы	
  (в	
  том	
  числе	
  строковые	
  
представления	
  значений)	
  
QMetaObject	
  
•  Имя	
  класса	
  
•  Методы	
  
•  Свойства	
  
•  Енамы	
  (в	
  том	
  числе	
  строковые	
  
представления	
  значений)	
  
•  Создание	
  новых	
  объектов	
  
QMetaObject	
  
•  Имя	
  класса	
  
•  Методы	
  
•  Свойства	
  
•  Енамы	
  (в	
  том	
  числе	
  строковые	
  
представления	
  значений)	
  
•  Создание	
  новых	
  объектов	
  
•  Вызов	
  методов	
  
QMetaObject	
  
•  Имя	
  класса	
  
•  Методы	
  
•  Свойства	
  
•  Енамы	
  (в	
  том	
  числе	
  строковые	
  
представления	
  значений)	
  
•  Создание	
  новых	
  объектов	
  
•  Вызов	
  методов	
  	
  
•  Преобразование	
  типов	
  (qobject_cast)	
  
Проблемы	
  
•  Лишний	
  шаг	
  компиляции	
  
Проблемы	
  
•  Лишний	
  шаг	
  компиляции	
  
•  Отсутствие	
  возможности	
  использования	
  
дефайнов	
  
Проблемы	
  
•  Лишний	
  шаг	
  компиляции	
  
•  Отсутствие	
  возможности	
  использования	
  
дефайнов	
  
•  moc	
  не	
  поддерживает	
  шаблонные	
  классы	
  
Проблемы	
  
•  Лишний	
  шаг	
  компиляции	
  
•  Отсутствие	
  возможности	
  использования	
  
дефайнов	
  
•  moc	
  не	
  поддерживает	
  шаблонные	
  классы	
  
•  signals	
  и	
  slots	
  не	
  входят	
  в	
  стандартные	
  
слова	
  C++	
  	
  
Проблемы	
  
•  Лишний	
  шаг	
  компиляции	
  
•  Отсутствие	
  возможности	
  использования	
  
дефайнов	
  
•  moc	
  не	
  поддерживает	
  шаблонные	
  классы	
  
•  signals	
  и	
  slots	
  не	
  входят	
  в	
  стандартные	
  
слова	
  C++	
  	
  
•  Мелкие	
  стилистические	
  проблемы:	
  
–  Полное	
  название	
  енамов	
  
–  Обертывание	
  указателей	
  на	
  функции	
  в	
  тайпдеф	
  
–  …	
  
Отказ	
  от	
  moc	
  
•  Теоретически	
  возможно	
  
Отказ	
  от	
  moc	
  
•  Теоретически	
  возможно	
  
•  Не	
  раньше	
  Qt6	
  
Отказ	
  от	
  moc	
  
•  Теоретически	
  возможно	
  
•  Не	
  раньше	
  Qt6	
  
•  Может	
  повлечь	
  за	
  собой	
  усложнение	
  
синтаксиса	
  
Вопросы?	
  

Метаобъектная система Qt

  • 1.
    Метаобъектная  система  Qt   Денис  Кормалев     Москва,  2015  
  • 2.
    Все,  что  мы  так  любим   •  Сигнал-­‐слоты    
  • 3.
    Все,  что  мы  так  любим   •  Сигнал-­‐слоты   •  Q_PROPERTY  
  • 4.
    Все,  что  мы  так  любим   •  Сигнал-­‐слоты   •  Q_PROPERTY   •  Связь  C++  и  QML  
  • 5.
    Все,  что  мы  так  любим   •  Сигнал-­‐слоты   •  Q_PROPERTY   •  Связь  C++  и  QML   •  invokeMethod  
  • 6.
    Все,  что  мы  так  любим   •  Сигнал-­‐слоты   •  Q_PROPERTY   •  Связь  C++  и  QML   •  invokeMethod   •  QVariant    
  • 7.
    Все,  что  мы  так  любим   •  Сигнал-­‐слоты   •  Q_PROPERTY   •  Связь  C++  и  QML   •  invokeMethod   •  QVariant   •  Работа  с  БД  
  • 8.
    Все,  что  мы  так  любим   •  Сигнал-­‐слоты   •  Q_PROPERTY   •  Связь  C++  и  QML   •  invokeMethod   •  QVariant   •  Работа  с  БД   Мета  система  
  • 9.
    Подключение   •  Наследник  от  QObject   •  Макрос  Q_OBJECT  
  • 10.
  • 11.
    moc   •  Meta  Object  Compiler  
  • 12.
    moc   •  Meta  Object  Compiler   •  Генерация  дополнительного  кода  перед   сборкой  проекта  
  • 13.
    moc   •  Meta  Object  Compiler   •  Генерация  дополнительного  кода  перед   сборкой  проекта   •  Обрабатываются  все  хедеры,  указанные  в   headers  секции  
  • 14.
    moc   •  Meta  Object  Compiler   •  Генерация  дополнительного  кода  перед   сборкой  проекта   •  Обрабатываются  все  хедеры,  указанные  в   headers  секции   •  Для  каждого  создается  файл  moc_myclass.cpp    
  • 15.
    moc   •  Meta  Object  Compiler   •  Генерация  дополнительного  кода  перед   сборкой  проекта   •  Обрабатываются  все  хедеры,  указанные  в   headers  секции   •  Для  каждого  создается  файл  moc_myclass.cpp   •  Чтобы  корректно  работали  классы  из  .cpp   файлов  –  надо  в  конце  .cpp  файла  подключить   myclass.moc  
  • 30.
    QMetaObject   •  Имя  класса      
  • 31.
    QMetaObject   •  Имя  класса   •  Методы    
  • 32.
    QMetaObject   •  Имя  класса   •  Методы   •  Свойства  
  • 33.
    QMetaObject   •  Имя  класса   •  Методы   •  Свойства   •  Енамы  (в  том  числе  строковые   представления  значений)  
  • 34.
    QMetaObject   •  Имя  класса   •  Методы   •  Свойства   •  Енамы  (в  том  числе  строковые   представления  значений)   •  Создание  новых  объектов  
  • 35.
    QMetaObject   •  Имя  класса   •  Методы   •  Свойства   •  Енамы  (в  том  числе  строковые   представления  значений)   •  Создание  новых  объектов   •  Вызов  методов  
  • 36.
    QMetaObject   •  Имя  класса   •  Методы   •  Свойства   •  Енамы  (в  том  числе  строковые   представления  значений)   •  Создание  новых  объектов   •  Вызов  методов     •  Преобразование  типов  (qobject_cast)  
  • 38.
    Проблемы   •  Лишний  шаг  компиляции  
  • 39.
    Проблемы   •  Лишний  шаг  компиляции   •  Отсутствие  возможности  использования   дефайнов  
  • 40.
    Проблемы   •  Лишний  шаг  компиляции   •  Отсутствие  возможности  использования   дефайнов   •  moc  не  поддерживает  шаблонные  классы  
  • 41.
    Проблемы   •  Лишний  шаг  компиляции   •  Отсутствие  возможности  использования   дефайнов   •  moc  не  поддерживает  шаблонные  классы   •  signals  и  slots  не  входят  в  стандартные   слова  C++    
  • 42.
    Проблемы   •  Лишний  шаг  компиляции   •  Отсутствие  возможности  использования   дефайнов   •  moc  не  поддерживает  шаблонные  классы   •  signals  и  slots  не  входят  в  стандартные   слова  C++     •  Мелкие  стилистические  проблемы:   –  Полное  название  енамов   –  Обертывание  указателей  на  функции  в  тайпдеф   –  …  
  • 43.
    Отказ  от  moc   •  Теоретически  возможно  
  • 44.
    Отказ  от  moc   •  Теоретически  возможно   •  Не  раньше  Qt6  
  • 45.
    Отказ  от  moc   •  Теоретически  возможно   •  Не  раньше  Qt6   •  Может  повлечь  за  собой  усложнение   синтаксиса  
  • 46.