Когда следует использовать объект Q?

в документации, что:

макрос Q_OBJECT должен появиться в частный раздел определения класса который объявляет свои собственные сигналы и слоты или использование других сервисов предоставлено метаобъектной системой Qt.

но ровно что это значит? На каких QObject-производных классах я могу безопасно опустить его? Возникнут ли проблемы, если вы опустите Q_OBJECT в производном от QObject классе, а затем унаследуете от него? В принципе, я хотел бы немного больше информации о том, когда я могу опустить его из своих классов Qt.

4 ответов


вы должны использовать Q_OBJECT макрос для любых не шаблонных классов, производных от QObject.

кроме сигналов и слотов,Q_OBJECT макрос предоставляет информация о метаобъекте это связано с данным классом.

как говорится в документация:

мы рекомендуем все подклассы QObject используют макрос Q_OBJECT независимо от того, на самом деле они не используют сигналы, слоты и свойства.

Предположим у нас есть следующий класс:

class Class : public QObject {
public:
  Class() {}
};

без Q_OBJECT, следующие системные функции metaobject (среди прочих) не будут работать для Class:

  1. qobject_cast<Class>() - из-за отсутствия метаданных

  2. QObject::tr() - из-за отсутствия метаданных

  3. слоты и invokables впервые заявил о себе в Class, при вызове или посмотрел по имени-никто из QMetaObject методы будут работать для этих методов, также как и Qt 4 connect - из-за отсутствия метаданных

  4. сигналы - с moc не будет генерировать их реализации, и код не будет компилироваться.

вы можете опустить его, конечно, но если вы когда-либо используете эти функции, вам нужно будет не забыть поместить макрос в объявление класса. Это довольно хрупкая практика, и ее лучше избегать. Экономия не стоит. Итак, не ждите-добавьте Q_OBJECT макрос для каждого класса, производного от QObject в принципе кодирования.

на Q_OBJECT макрос никогда используется для классов, которые не являются производными от QObject. Чтобы добавить invokables и свойства таких классов, используйте макрос.


Если вы хотите использовать сигналы / слоты, вы должны включить макрос Q_OBJECT и вывести класс из QObject.

в противном случае вы можете оставить его, но это не повредит включить его во все классы Qt gui


Ну, первая часть довольно ясна, как вы, вероятно, уже знаете.. сигналы и слоты, остальная часть Метаобъектной системы немного менее известна. Возможно, одной из наиболее полезных функций являются динамические свойства. Хотя они имеют много применений, я использовал их, чтобы воспользоваться системой анимации Qt QPropertyAnimation.

здесь есть немного больше информации о метаобъектной системе:http://doc.qt.io/archives/4.6/metaobjects.html

Я думаю, что нижняя строка является, если вы наследуете от иерархии QObject, бросьте макрос Q_OBJECT независимо. Это просто сделать и избавит вас от некоторых потенциально озадачивающих проблем в будущем.


то, что @liaK сказал правильно (короче: вы должны всегда используйте макрос Q_OBJECT в любом классе, производном от QObject).

одна вещь, которую я не видел выделенной, это то, что если вы не явно поставил Q_OBJECT макро с помощью иногда очень удобно qobject_cast не работает!!!