Поиск…


замечания

Класс 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 с обратным порядком декларации , которая сломается автоматическое уничтожение.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow