Когда следует использовать объект 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
:
qobject_cast<Class>()
- из-за отсутствия метаданныхQObject::tr()
- из-за отсутствия метаданныхслоты и invokables впервые заявил о себе в
Class
, при вызове или посмотрел по имени-никто изQMetaObject
методы будут работать для этих методов, также как и Qt 4connect
- из-за отсутствия метаданныхсигналы - с
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 не работает!!!