문제

나는 수업이 있습니다 (MyClass)는 Qt 내장 객체(QGraphicsTextItem). QGraphicsTextItem 간접적으로 상속받음 QObject. MyClass 또한 인터페이스를 구현합니다. MyInterface.

class MyClass : public QGraphicsTextItem, public MyInterface

사용할 수 있어야 해요 connect 그리고 disconnect ~에 MyInterface*.그러나 그것은 보인다 connect 그리고 disconnect 오직 일만 해 QObject* 인스턴스.Qt는 QObject 파생 클래스의 다중 상속을 지원하지 않으므로 파생할 수 없습니다. MyInterface ~에서 QObject.(어쨌든 인터페이스에는 그다지 의미가 없습니다.)

이있다 온라인 문제 토론, 그러나 IMO에서 제안된 솔루션은 일반적인 경우(인터페이스를 통해 개체에 액세스하는 경우)에는 상당히 쓸모가 없습니다. MyInterface* 하지만 파생 유형으로 캐스팅해야 합니다.부터 MyClass 많은 것 중 하나입니다 MyInterface-파생 클래스의 경우 "코드 냄새 나는" if-this-cast-to-this-else-if-that-cast-to-that 문이 필요하고 인터페이스의 목적을 무효화합니다.

이 제한 사항에 대한 좋은 해결책이 있습니까?

업데이트: 나는 만약 내가 dynamic_castMyInterface* 에게 QObject* (왜냐면 난 알다 모두 MyInterface-파생 클래스도 결국에는 다음을 상속합니다. QObject, 작동하는 것 같습니다.그건:

MyInterface *my_interface_instance = GetInstance();
connect(dynamic_cast<QObject*>(my_interface_instance), SIGNAL(MyInterfaceSignal()), this, SLOT(TempSlot()));

하지만 이것은 정말 정의되지 않은 동작을 요구하는 것 같습니다....

도움이 되었습니까?

해결책

당신은 스스로 답을 찾았습니다:Dynamic_cast는 예상대로 작동합니다.정의되지 않은 동작이 아닙니다.얻은 MyInterface의 인스턴스가 QObject가 아닌 경우 캐스트는 null을 반환하고 이를 방지할 수 있습니다(인터페이스의 모든 인스턴스도 QObject라고 말했기 때문에 이런 일은 발생하지 않습니다).그러나 작동하려면 RTTI를 켜야 한다는 점을 기억하십시오.

나는 또한 몇 가지 다른 제안을 드리고 싶습니다:

  • 사용 Q_인터페이스 기능입니다(플러그인에만 해당되는 것은 아닙니다).그런 다음 QObject 측면에서 작업하고 실제로 필요할 때 qobject_cast를 사용하여 MyInterface에 대해 쿼리합니다.나는 귀하의 문제를 자세히 알지 못하지만 모든 MyInterface 인스턴스도 QObject라는 것을 알고 있으므로 이것이 가장 합리적인 접근 방식인 것 같습니다.

  • 을 추가하다 QObject* asQObject() MyInterface에 대한 추상 메서드를 만들고 다음과 같이 구현합니다. { return this; } 모든 하위 클래스에서.

  • 대신 QGraphicsTextItem(구성) 존재 하나(상속).

다른 팁

생성자에서 QObject를 사용하는 MyInterface를 선언할 수 있습니다.

class MyInterface {
public:
                MyInterface(QObject * object);
    QObject *   object() { return m_object; }
    ...
private:
    QObject *   m_object;
};

MyInterface::MyInterface(QObject * object) :
    m_object(object)
{
    ...
}

그런 다음 MyClass 생성자에서 다음을 수행합니다.

MyClass::MyClass() :
MyInterface(this)
{
    ...
}

그리고 신호를 연결할 수 있습니다:

MyInterface *my_interface_instance = GetInstance();
connect(my_interface_instance->object(), SIGNAL(MyInterfaceSignal()), this, SLOT(TempSlot()));
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top