IT박스

Q_OBJECT 매크로는 무엇을합니까?

itboxs 2020. 7. 14. 20:57
반응형

Q_OBJECT 매크로는 무엇을합니까? 모든 Qt 객체에이 매크로가 필요한 이유는 무엇입니까?


방금 Qt를 사용하기 시작했으며 모든 예제 클래스 정의에 매크로 Q_OBJECT가 첫 번째 줄로 있음을 알았 습니다. 이 전 처리기 매크로의 목적은 무엇입니까?


로부터 Qt는 문서 :

Meta-Object Compiler 인 moc는 Qt의 C ++ 확장을 처리하는 프로그램입니다.

moc 도구는 C ++ 헤더 파일을 읽습니다. Q_OBJECT 매크로를 포함하는 하나 이상의 클래스 선언을 찾으면 해당 클래스의 메타 오브젝트 코드를 포함하는 C ++ 소스 파일을 생성합니다. 무엇보다도 신호 및 슬롯 메커니즘, 런타임 유형 정보 및 동적 특성 시스템에는 메타 오브젝트 코드가 필요합니다.


그것은 단지이 클래스에 gui 요소가 있고 'moc'를 통해 실행되어야한다고 프리 컴파일러에게 알려줍니다. 신호 / 슬롯 메커니즘을 사용하는 클래스에만 이것을 추가하면됩니다.
그러나 다른 클래스에서는 조용히 무시됩니다. 빌드 시간이 길어집니다.


MOC (메타 개체 컴파일러)는 Q_OBJECT 매크로 포함 헤더 파일을 C ++ 해당 소스 코드로 변환합니다. 기본적으로 신호 슬롯 메커니즘을 제어하고 C ++ 컴파일러가 이해할 수있게합니다.


1 Meta-Object System 의 Qt 문서에서

moc 도구는 C ++ 소스 파일을 읽습니다. Q_OBJECT 매크로를 포함하는 하나 이상의 클래스 선언을 찾으면 해당 클래스 각각에 대한 메타 오브젝트 코드를 포함하는 다른 C ++ 소스 파일을 생성합니다. 이 생성 된 소스 파일은 클래스의 소스 파일에 #include되거나 더 일반적으로 클래스의 구현과 컴파일 및 링크됩니다.

2 Q_OBJECT의 Qt 문서에서

Q_OBJECT 매크로는 자체 신호와 슬롯을 선언하거나 Qt의 메타 객체 시스템이 제공하는 다른 서비스를 사용하는 클래스 정의의 private 섹션에 나타나야합니다.

3 moc의 Qt 문서에서

moc 도구는 C ++ 헤더 파일을 읽습니다. Q_OBJECT 매크로를 포함하는 하나 이상의 클래스 선언을 찾으면 해당 클래스의 메타 오브젝트 코드를 포함하는 C ++ 소스 파일을 생성합니다. 무엇보다도 신호 및 슬롯 메커니즘, 런타임 유형 정보 및 동적 특성 시스템에는 메타 오브젝트 코드가 필요합니다.

4 신호 및 슬롯에 대한 Qt 문서에서

Q_OBJECT 매크로는 moc에 의해 구현되는 여러 멤버 함수를 선언하기 위해 전처리기에 의해 확장됩니다. "LcdNumber에 대한 vtable에 대한 정의되지 않은 참조"행에 컴파일러 오류가 발생하면 moc을 실행하거나 링크 명령에 moc 출력을 포함하는 것을 잊었을 수 있습니다.


Q_OBJECT 매크로는 자체 신호와 슬롯을 선언하거나 Qt의 메타 객체 시스템이 제공하는 다른 서비스를 사용하는 클래스 정의의 private 섹션에 나타나야합니다.

참고 : https://stackoverflow.com/questions/1368584/what-does-the-q-object-macro-do-why-do-all-qt-objects-need-this-macro

반응형