수색…
비고
QObject
클래스는 모든 Qt 객체의 기본 클래스입니다.
QObject 예제
Q_OBJECT
매크로는 클래스의 private 섹션에 나타납니다. Q_OBJECT
는 클래스가 QObject
하위 클래스 QObject
. 이 매크로는 클래스가 신호 / 슬롯을 선언하고 Qt 메타 객체 시스템을 사용하는 데 필요합니다.
메타 오브젝트 컴파일러 (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 ++에서이를 cast하기 위해 일반적으로 dynamic_cast
사용할 수 있습니다. 이는 컴파일하는 동안 RTTI가 활성화되어 있는지 여부에 달려 있습니다.
다른 손에있는 Q_OBJECT 매크로는 qobject_cast에서 사용할 수있는 변환 체크 및 코드를 생성합니다.
myObject* my = qobject_cast<myObject*>(obj);
if(!myObject)
{
//wrong type
}
이것은 RTTI에 의존하지 않습니다. 또한 동적 라이브러리 경계 (Qt 인터페이스 / 플러그인을 통해)에 캐스트 할 수 있습니다.
QObject 수명 및 소유권
QObject는 원시 C ++의 원시 포인터, 고유 포인터 또는 공유 포인터와 비교하여 고유 한 대체 수명 개념을 제공합니다.
QObject는 부모 / 자식 관계를 선언하여 objecttree를 작성할 수 있습니다.
이 관계를 선언하는 가장 간단한 방법은 부모 객체를 생성자에 전달하는 것입니다. 대체로 setParent
를 호출하여 QObject
의 부모를 수동으로 설정할 수 있습니다. 이것은이 관계를 선언하는 유일한 방향입니다. 부모 클래스에는 자식을 추가 할 수 없지만 다른 방법으로는 자식을 추가 할 수 없습니다.
QObject parent;
QObject child* = new QObject(&parent);
이제 parent
가 스택에서 삭제되면 unwind child
도 삭제됩니다.
우리가 QObject
를 삭제할 때 그것은 부모 객체로부터 "등록 해제"될 것입니다;
QObject parent;
QObject child* = new QObject(&parent);
delete child; //this causes no problem.
스택 변수에도 동일하게 적용됩니다.
QObject parent;
QObject child(&parent);
child
은 스택 parent
중에 parent
보다 먼저 삭제되고 그 부모로부터 자신을 등록 해제합니다.
참고 : setParent
를 수동으로 호출하여 역순으로 선언 할 수 있습니다 . 그러면 자동 파기 가 중단됩니다.