2010-07-08 115 views
10

在我的Qt應用程序中,我有一個基類如下。我使用QObject是因爲我想在所有派生類中使用Signal-Slot機制。Qt/C++中多重繼承的正確方法是什麼?

class IRzPlugin : public QObject { 

public: 
    virtual void registerMenu(QWidget*); 
    virtual void execute(); 
} 

然後我有另一個類如下。我需要從QWidget進行擴展,因爲我需要在所有派生類中實現事件處理方法(mouseMoveEvent(),keyPressEvent().. etc);

class IRzLayeringPlugin : public IRzPlugin , public QWidget{ 

} 

但是編譯器給出了這些錯誤:

C:\svn\osaka3d\tags\iter08\prototype\osaka3d\rinzo\plugin\moc_IRzLayeringPlugin.cxx: In member function `virtual const QMetaObject* IRzLayeringPlugin::metaObject() const': 
C:\svn\osaka3d\tags\iter08\prototype\osaka3d\rinzo\plugin\moc_IRzLayeringPlugin.cxx:51: error: `QObject' is an ambiguous base of `IRzLayeringPlugin' 
C:\svn\osaka3d\tags\iter08\prototype\osaka3d\rinzo\plugin\moc_IRzLayeringPlugin.cxx:51: error: `QObject' is an ambiguous base of `IRzLayeringPlugin' 
make[2]: *** [CMakeFiles/Rinzo.dir/plugin/moc_IRzLayeringPlugin.cxx.obj] Error 1 

回答

6

在當前化身中,不可能在派生類的多重繼承路徑中使用QObject(例如IRzLayeringPlugin類)。我見過的唯一解決方案是創建一個沒有任何QObject繼承性的接口類,但函數直接對應於您要使用的QObject函數,然後在接口和您的其他類繼承之間實現橋接類。它變得很難看得很快。

+0

謝謝,那是我最後做的/ – 2010-07-09 01:19:10

3

QObject基類是越來越比包含在派生類中一次。您需要使用virtual base classes來解決問題。

+3

在這種情況下這是不可能的,因爲'QWidget'需要從'QObject'實際導出。 – Job 2010-07-08 09:52:04

6

今天還有類似的問題here

基本上,需要做兩兩件事:接口類的聲明

  • 接口加入了Q_INTERFACES宏類的
  • 在此之後後

    • 添加Q_DECLARE_INTERFACE,qobject_cast將與你的界面。

      如果您想使用接口中的信號和插槽,那麼您運氣不好,因爲您只能使用派生自QObject的類型來實現這一點。但在這種情況下,您總會遇到'QObject' is an ambiguous base of 'IRzLayeringPlugin'錯誤。

      在這種情況下,@ Caleb的想法仍然是最好的。

    相關問題