| 
  Система метаоб'єктів 
 Частина розширень реалізована стандартними методами C ++, проте Qt використовує і більш складні синтаксичні розширення, тому він використовує автоматичну генерацію коду. 
 Для цього в C ++ реалізований механізм шаблонів, але він не надає всіх необхідних Qt можливостей, погано сумісний з динамічної об'єктною моделлю і в повній мірі не підтримується всіма версіями компіляторів. 
 У складних ситуаціях Qt використовує свій компілятор метаоб'ектів moc, що перетворює код з розширеннями в стандартний код C ++. Для позначення того, що клас використовує метаоб'ектние можливості (і, відповідно, повинен оброблятися moc), в розділі private потрібно вказати макрос Q_OBJECT. 
 Якщо ви зустрічаєте дивні помилки компіляції, які повідомляють про те, що у класу не визначений конструктор, або у нього немає таблиці віртуальних функцій (vtbl), швидше за все ви забули код, що генерується moc. Зазвичай це відбувається, якщо не вказано макрос Q_OBJECT. 
 Щоб уникнути помилок Q_OBJECT краще використовувати в усіх класах, успадкованих від QObject (побічно або безпосередньо). 
 Використання динамічного підходу пов'язано з певними втратами в продуктивності в порівнянні зі статичним, однак цим можна знехтувати, якщо взяти до уваги отримані переваги. 
 У числі інших, метаоб'ектний код додає метод 
 virtual const QMetaObject * QObject :: metaObject () const; 
 який повертає вказівник на метаоб'ект об'єкта. 
 На системі метаоб'ектів влаштовані сигнали, слоти і властивості. 
 При спадкуванні від QObject пам'ятайте про обмеження, що накладаються moc: 
 При множинному успадкуванні нащадком QObject повинен бути перший і тільки перший успадкований клас: 
   
 
class MyClass : public QObject, public Foo, public Bar
{
 // ...
};
  
 Віртуальне успадкування з QObject не підтримується. 
   
   
  |