2011-03-14 5 views
2

나는 오랫동안 Qt 프로그래머로 일해 왔으며 Qt의 일반적인 기능 대부분을 잘 알고 있습니다. 나는 연결 문이 신호를 런타임에 슬롯에 연결하는 방법에 대해 여전히 혼란 스럽다. 기본적으로 컴파일시에 어떤 일이 일어나고 런타임에는 어떻게되는지 알고 싶습니다.QT에서 신호와 슬롯을 어떻게 연결합니까?

컴파일 시간 : 메타 오브젝트 컴파일러는 추가 cpp 파일 (Q_OBJECT가 포함 된 각 클래스에 하나씩)에 신호를 구현하는 코드를 생성합니다.

런타임 : 신호가 슬롯에 매핑되고 슬롯이 실행됩니까? 이것은 내가 분명하지 않은 부분입니다 ... 신호와 슬롯은 신호/슬롯 이름의 문자열 표현으로 확장되는 매크로입니다.이 코드와 메타 객체는 런타임에 슬롯에 대한 호출을 매핑하는 데 어떻게 도움이됩니까? 자세한 내용은 ... 주시면 감사하겠습니다

편집 : 이 링크의 문서와 함께 (... 당신은 피투성이의 세부 사항에 관심이있는 경우에만) .. 당신에게 http://dev.libqxt.org/libqxt/wiki/Meta_Object_Format

커플이 더 나은 아이디어를 줄 것이다 QMetaObject 및 모든 것이 명확 해져야합니다.

답변

2

당신이하는 방법 (신호/슬롯)에 신호를 연결할 수 있습니다.

그러나 모두 올바른 메소드 번호를 얻는 데 초점을 맞 춥니 다.

올바른 메서드 번호와 개체를 호출 한 후 QObject에서 가상 함수 (qt_metacall)를 호출하면 주어진 번호에서 올바른 메서드를 찾을 수 있습니다. MOC가 생성하는 파일에서이 기능을 찾을 수 있습니다. 또한 생성 된 파일에서 클래스의 정적 QMetaObject를 만드는 행을 찾을 수 있습니다. 이 객체는 슬롯 번호와 신호 이름을 메소드 번호에 등록합니다.

읽을 몇 가지 흥미로운 물건을 제공 할 수 있습니다 :

http://doc.qt.io/qt-5/qmetaobject.html
http://doc.qt.io/qt-5/metaobjects.html
http://doc.qt.io/qt-5/signalsandslots.html

또한 실행하여 많은 것을 배울 수는 디버거 슬롯 활성화를 생각했다.

+0

감사합니다. 대답에 대한 ... 나는 moc 파일에서 생성 된 qt_metacall 함수를 볼 수 있습니다 .... 그러나 소스 객체의 moc 파일에는 슬롯에 대한 정보 만이 있습니다 ... 어떻게 슬롯을 찾을 수 있습니까? – maxpayne

+0

내가 이해하면 확실하지 않습니다. 슬롯과 신호는 MOC 파일에서 생성 된 정적 메타 객체를 통해 등록됩니다. MOC 파일에 슬롯이 나열되어 있지 않습니까? 그래야지. 신호와 슬롯이 모두 하나의 힙에 있기 때문에 혼란 스러울 수 있습니다. 내가 이해할 수 있도록 좀 더 철저히 설명해 주시겠습니까? – 0xbaadf00d

0

기본적으로 신호 및 슬롯은 목표 -C에서 메시지과 유사하게 작동합니다.

매크로는 전처리 기가 슬롯이 호출 될 때 효과적으로 실행될 함수/메소드를 "등록"하고 "조회"하는 일부 코드로 대체합니다.

신호를 내보내거나 슬롯을 호출하는 코드가이를 사용하는 다른 코드 모듈에 대해 많이 알 필요가 없기 때문에 더 많은 유연성을 제공합니다. 각 슬롯 및 신호는 런타임에 조회 한 후 호출되는 서명을 생성합니다.

C/C++에 익숙하다면 이것을 동적 라이브러리와 비교할 수 있습니다. 기호는 런타임에 조회되고 그 주소가 사용되어 CPU가 실행되도록 "점프"하게합니다.

또한, 이러한 링크는 당신을 도울 수 있습니다

+0

답장을 보내 주셔서 감사합니다. 나는 명확한 세부 사항을 찾고있었습니다. QT 문서 및 기타 게시물에 대해 잘 알고 있습니다. 특히 생성 된 서명이 실행 시간과 역할에 어떻게 영향을 미치는지에 특히 관심이 있습니다. 메타 오브젝트는 이것으로 재생됩니다 .. – maxpayne

+0

어때? http://doc.qt.nokia.com/latest/signalsandslots.html#meta-object-information and this http://doc.qt.nokia.com/latest/metaobjects.html#meta-object-system – BastiBen

관련 문제