QT에서는 여러 상속이있는 q_object 슬롯과 신호를 어떻게 사용합니까?

StackOverflow https://stackoverflow.com/questions/1489238

  •  18-09-2019
  •  | 
  •  

문제

나는 관련 질문을 살펴보고 내가 말한 내용을 정확히 다루는 것을 찾을 수 없었으므로 설명하겠습니다.

수업이 있습니다. 자체 슬롯과 신호가 필요하지만 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의 일부 멤버를 적용하려고합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top