QT에서는 여러 상속이있는 q_object 슬롯과 신호를 어떻게 사용합니까?
문제
나는 관련 질문을 살펴보고 내가 말한 내용을 정확히 다루는 것을 찾을 수 없었으므로 설명하겠습니다.
수업이 있습니다. 자체 슬롯과 신호가 필요하지만 QXMLDEFAULTHANDLER에서 상속 해야하는 FOO가 있다고 가정 해 봅시다 (QXMLDEFAULTHANDLER에서 상속해야하지만 QHTTP를 사용하여 웹 사이트를 QBUFFER로 직접 읽으려고 할 때이 상황에 직면했습니다).
class foo: public QXmlDefaultHandler, public QObject
{
public:
foo();
~foo();
Q_OBJECT
public slots:
void bar();
}
이 코드는 CPP가 동반하여 다른 곳의 신호에 막대를 연결하는 경우 컴파일되지 않습니다. QXMLDEFAULTHANDLER의 회원이 아닌 QoBject의 일부 구성원에 대한 오류가 발생합니다. 또한 q_object를 이동할 수 없거나 다른 것을 구현하지 않기 위해 vtable 오류가 발생합니다 (계속하십시오! 시도하십시오!).
(매우 간단한) 수정에 대한 내 대답을 참조하십시오. 내가 당신이 나보다 더 잘 설명한다고 생각한다면 나는 당신을 받아 들인 대답으로 투표 할 것입니다.
편집 : C ++ 및 QT VETS를 위해 더 잘 설명 할 수 있다면 답변을 게시하십시오. 나는이 정보를 찾는 데 꽤 많은 시간을 보냈으므로 나보다 더 잘할 수 있다면 다른 사람을 도와주세요.
해결책
그만큼 MOC에 대한 문서 다중 상속의 경우 Qobject를 제공하는 클래스가 먼저 나타나야한다고 말합니다.
여러 상속을 사용하는 경우 MOC는 첫 번째 상속 클래스가 Qobject의 서브 클래스라고 가정합니다. 또한 첫 번째 상속 클래스 만 Qobject인지 확인하십시오.
// correct class SomeClass : public QObject, public OtherClass { ... };
Qobject와의 가상 상속은 지원되지 않습니다.
다른 팁
class foo: public QObject, public QXmlDefaultHandler
{
public:
foo();
~foo();
Q_OBJECT
public slots:
void bar();
}
간단하게 들리면 상속 목록에 Qobject를 먼저 놓지 않으면이 작업은 불가능합니다. QT의 메타 객체 시스템의 한계입니다. 이 작업을 수행하지 않으면 컴파일러는 QXMLDEFAULTHANDLER의 일부로 QOBJECT의 일부 멤버를 적용하려고합니다.