수색…


비고

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();

objmyObject 유형인지 확인하고 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 를 수동으로 호출하여 역순으로 선언 할 수 있습니다 . 그러면 자동 파기 중단됩니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow