Вы должны использовать макрос Q_OBJECT
для любых не шаблонных классов, производных от QObject
.
Кроме сигналов и слотов, макрос Q_OBJECT
предоставляет информация мета-объекта , связанная с данным классом.
Как указано в документации :
, мы настоятельно рекомендуем все подклассыQObject использует макрос Q_OBJECT независимо от того, используют ли они на самом деле сигналы, слоты и свойства.
Предположим, у нас есть следующий класс:
class Class : public QObject {
public:
Class() {}
};
БезQ_OBJECT
, следующие функции системы метаобъектов (помимо прочего) не будут работать для Class
:
qobject_cast<Class>()
- из-за отсутствия метаданных
QObject::tr()
- из-за отсутствия метаданных
слотов и активируемых объектов, впервые объявленных в Class
, при вызове или поиске по имени - ни один из QMetaObject
методов не будет работать дляэти методы, также не будет Qt 4 connect
- из-за отсутствующих метаданных
сигналов - поскольку moc
не будет генерировать их реализации и код не будет компилироваться.
Конечно, вы можете его опустить, но еслиВы когда-либо используете эти функции, вам нужно помнить, чтобы вставить макрос в объявление класса.Это довольно хрупкая практика, которую лучше избегать.Экономия не стоит.Так что не ждите - добавьте макрос Q_OBJECT
в каждый класс, производный от QObject
в соответствии с политикой кодирования.
Макрос Q_OBJECT
не должен использоваться , никогда на классах, которые не являются производными от QObject
.Чтобы добавить вызываемые и свойства к таким классам, используйте вместо этого макрос Q_GADGET
.