Поиск…
замечания
Класс QObject является базовым классом для всех объектов Qt.
Пример QObject
Q_OBJECT отображается в закрытом разделе класса. Q_OBJECT требует, чтобы класс был подклассом QObject . Этот макрос необходим, чтобы класс объявлял свои сигналы / слоты и использовал систему мета-объектов Qt.
Если Meta Object Compiler (MOC) находит класс с Q_OBJECT , он обрабатывает его и генерирует исходный файл C ++, содержащий исходный код метаобъекта.
Вот пример заголовка класса с Q_OBJECT и сигналом / слотами:
#include <QObject>
class MyClass : public QObject
{
Q_OBJECT
public:
public slots:
void setNumber(double number);
signals:
void numberChanged(double number);
private:
}
qobject_cast
T qobject_cast(QObject *object)
Функцией, которая добавляется путем получения QObject и с использованием макроса Q_OBJECT является возможность использования qobject_cast .
Пример:
class myObject : public QObject
{
Q_OBJECT
//...
};
QObject* obj = new myObject();
Чтобы проверить, является ли obj myObject и для его включения в C ++, вы обычно можете использовать dynamic_cast . Это зависит от включения RTTI во время компиляции.
Макрос Q_OBJECT с другой стороны генерирует проверки и код преобразования, которые могут использоваться в qobject_cast.
myObject* my = qobject_cast<myObject*>(obj);
if(!myObject)
{
//wrong type
}
Это не зависит от RTTI. А также позволяет использовать границы динамической библиотеки (через Qt-интерфейсы / плагины).
Срок жизни и владение QObject
QObjects имеют свою собственную альтернативную концепцию жизни по сравнению с исходными, уникальными или совместными указателями на C ++.
У QObjects есть возможность построить objecttree, объявив родительские / дочерние отношения.
Самый простой способ объявить это отношение - передать родительский объект в конструкторе. В качестве альтернативы вы можете вручную установить родительский объект QObject , вызвав setParent . Это единственное направление для объявления этих отношений. Вы не можете добавить ребенка в класс родителей, но только наоборот.
QObject parent;
QObject child* = new QObject(&parent);
Когда parent теперь удаляется в стеке-разматывании, child элемент также будет удален.
Когда мы удаляем QObject он сам «отменит регистрацию» из родительского объекта;
QObject parent;
QObject child* = new QObject(&parent);
delete child; //this causes no problem.
То же самое относится и к переменным стека:
QObject parent;
QObject child(&parent);
child будет удален до parent во время удаления стека и отменит его от родителя.
Примечание: Вы можете вручную вызвать setParent с обратным порядком декларации , которая сломается автоматическое уничтожение.