我有一個類(MyClass
),它從Qt內置對象(QGraphicsTextItem
)繼承了其大部分功能。 QGraphicsTextItem
間接從QObject
繼承。 MyClass
也實現了一個接口,MyInterface
。使用Qt信號和具有多重繼承的插槽
class MyClass : public QGraphicsTextItem, public MyInterface
我需要能夠在MyInterface*
使用connect
和disconnect
。但看起來connect
和disconnect
只適用於QObject*
實例。由於Qt不支持來自QObject派生類的多重繼承,因此我無法從QObject
派生MyInterface
。 (無論如何,這對接口來說都沒有什麼意義)。
有一個discussion of the problem online,但是IMO提出的解決方案在通常情況下是無用的(通過接口訪問一個對象),因爲你不能連接信號和插槽從MyInterface*
,但必須將其轉換爲派生類型。由於MyClass
是許多MyInterface
派生類中的一個,因此如果將這種轉換爲這種其他的如果該轉換爲該語句並且破壞了該接口的目的,則這將需要「代碼難聞」。
有沒有很好的解決這個限制?
更新:我注意到,如果我dynamic_cast
一個MyInterface*
到QObject*
(因爲我知道所有衍生MyInterface
類也從QObject
繼承最終,它似乎工作,即:
MyInterface *my_interface_instance = GetInstance();
connect(dynamic_cast<QObject*>(my_interface_instance), SIGNAL(MyInterfaceSignal()), this, SLOT(TempSlot()));
但這真的好像我要求未定義的行爲....
你是怎麼聲明MyInterfaceSignal的? – 2010-07-16 07:07:22
'MyInterfaceSignal'在'MyInterface'中聲明爲一個*非信號*保護的純虛方法,然後在派生類中作爲*信號*聲明。因此,編譯器確保派生類具有該方法,但是由實現者將其標記爲信號。這很麻煩,因爲我沒有真的從MyInterface.MyInterfaceSignal調用虛擬調用表,而是依賴於SIGNAL宏在一天結束時只是解析爲「 char *'方法名稱。 – 2010-07-16 12:43:08