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