2012-02-27 96 views
0

我有一個純虛類A,在其上我做模擬qobject_cast失敗

Q_DECLARE_INTERFACE(A, "org.something.A") 

,我有作爲B類,其繼承A和QObject的實現的插件,具有作爲接口A和實現所有純的

class B : public QObject, public A 
{ 
    Q_OBJECT 
    Q_INTERFACES(A) 

    public: 
     void someMethod(); 
} 

,並在CPP虛擬方法:

Q_EXPORT_PLUGIN2(A, A) 

這種運作良好。在現實中有許多不同的接口,以及核心應用程序(我沒有寫,並在其上我不能做大規模的改造)調用

qobject_cast<A *>(bPointer); 

,並檢查結果知道,如果某插件實現的接口。

這一切都很好。

如何,我想在B類中確定在運行時是否要實現某個接口。

該方法將始終實現,但我有時會使qobject_cast失敗,但在運行時確定(單個實例總是失敗或成功爲相同的接口)。

這聽起來很奇怪,但原因是我想添加Python(或其他語言)插件。他們將有一個C++包裝。他們的python源代碼將使用rcc文件進行存儲。所有python插件的C++代碼都應該是一樣的。

C++包裝器會調用python方法來確定哪些接口是由python代碼實現的,並且如果python代碼沒有實現接口,則會導致qobject_cast失敗。 C++包裝類將實現所有接口方法並將調用轉發給python,但只有那些已成功轉換的調用纔會真正被調用。

重新實現QObject的元相關方法可能是可行的,但我不知道是哪一個。

我希望你明白我想要做什麼(雖然它不是很清楚)。也許有完全不同的方式來做到這一點?

感謝

+0

我懷疑有什麼辦法讓qobject_cast在這裏做你想做的。相反,爲什麼不只是定義一個接口,並且可以返回你想要在運行時控制的接口呢? – 2012-02-27 18:07:43

回答

0

只使用公共的Qt API你不能改變qobject_cast行爲,。 另請注意,每個插件庫只能有一個插件對象實例。

解決方案將成爲一個插件,作爲工廠工作並按請求返回接口。

+0

好的謝謝。我有一個所有插件實現的接口。我只是給它添加一個'bool implementsInterface(QString)'方法。另外請注意,每個插件庫只能有一個插件對象實例。每個Python插件都有一個插件庫。但是包裝**代碼**將是相同的。 – paul 2012-02-28 16:57:26