Qt — Q_OBJECT против #включить

#c #qt #qobject

#c #qt #qobject

Вопрос:

Имеет ли использование Q_Object макроса и #include <QObject> тот же эффект? Другими словами, это два разных способа для одной цели?

Спасибо.

Ответ №1:

Нет. Вам нужно Q_OBJECT включить в определение класса объекты, для которых вы хотите использовать сигналы / слоты, в дополнение к включению правильных заголовков.

Из QObject документов api :

Обратите внимание, что макрос Q_OBJECT является обязательным для любого объекта, который реализует сигналы, слоты или свойства.Вам также необходимо запустить компилятор Meta Object для исходного файла. Мы настоятельно рекомендуем использовать этот макрос во всех подклассах QObject независимо от того, используют ли они на самом деле сигналы, слоты и свойства, поскольку невыполнение этого требования может привести к странному поведению определенных функций.

Просто взгляните на различные примеры в документации Qt для получения более подробной информации и примера кода. Ссылка на сигналы и слоты — хорошее место для поиска. Также посмотрите на ссылку на объектную модель.

Комментарии:

1. Спасибо за ваш ответ. Не могли бы вы объяснить это более подробно, если возможно? You need Q_OBJECT in the class definition of things you want signals/slots on ? Спасибо

2. Пожалуйста, ознакомьтесь с документацией для Q_Object, на которую дана ссылка. В этом документе даже указан пример класса, который показывает, как используется макрос Q_OBJECT.

Ответ №2:

Они используются для двух разных целей.

Q_OBJECT:

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

Если вы хотите использовать сигналы, слоты и другие функции метаобъекта, у вас должен быть Q_OBJECT макрос.

#include<QObject> :

Это используется для включения заголовочного файла qobject.h, чтобы вы могли использовать функции, доступные в классе QObject .. Скажем, например. QObject::connect() .

И чтобы использовать Q_OBJECT макрос, вы должны #include <QObject> .

Ответ №3:

Нет. Вы добавляете этот макрос к классам, производным от QObject . Но вам все равно нужны заголовки, как говорит Mat! Смотрите http://doc.qt.io/qt-5/qobject.html#Q_OBJECT