Система метаоб'єктів
Частина розширень реалізована стандартними методами 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 не підтримується.
|