2010-07-08 23 views
10

Benim Qt uygulamasında, aşağıdaki gibi bir temel sınıf var. QObject kullanıyorum çünkü tüm türetilmiş sınıflarda Sinyal Yuvası mekanizmasını kullanmak istiyorum.Qt/C++ 'da Çoklu mirasın doğru yolu nedir?

class IRzPlugin : public QObject { 

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

Daha sonra takip ettiğim başka bir dersim var. QWidget'ten genişletmem gerekiyor çünkü tüm türetilmiş sınıflarda olay işleme yöntemlerini kullanmam gerekiyor (mouseMoveEvent(), keyPressEvent() .. vb);

class IRzLayeringPlugin : public IRzPlugin , public QWidget{ 

} 

Fakat derleyici verir bu hatalar:

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 

cevap

6

Geçerli enkarnasyonda, türetilmiş bir sınıf için (IRzLayeringPlugin sınıfınız gibi) QObject'un birden fazla kalıtım yolu içinde kullanılması mümkün değildir. Gördüğüm tek çözüm, herhangi bir QObject kalıtsal olmayan bir arabirim sınıfı oluşturmaktı, ancak kullanmak istediğiniz QObject işlevlerine doğrudan karşılık gelen işlevlerle, daha sonra arabiriminizle diğer QObject sınıf devralma arasındaki köprüyü uygulamanız gerekir. sınıf. Oldukça çabuk çirkinleşiyor.

+0

teşekkürler, sonunda ne yaptım / –

3

QObject temel sınıf kez türetilmiş sınıfta daha dahil oluyor. Sorunu çözmek için virtual base classes kullanmanız gerekir.

+3

Bu durumda, 'QWidget’in' QObject''den neredeyse türetilmesi gerekeceğinden bu mümkün değildir. – Job

6

Bugün de benzer bir soru vardı here.

Temelde, iki şey gereklidir:

  • sınıfın Q_INTERFACES makroya Bundan sonra

arayüzünü ekleme arayüzü sınıf bildiriminde

  • sonra Q_DECLARE_INTERFACE ekleme, qobject_cast birlikte çalışacaktır senin arayüzlerin.

    Arabirimlerden sinyal ve yuva kullanmak isterseniz, şansınız kalmaz, çünkü bunu yalnızca QObject türünden türeyen türlerle yapabilirsiniz. Ancak bu durumda, her zaman 'QObject' is an ambiguous base of 'IRzLayeringPlugin' hatasını alırsınız.

    Bu durumda, @ Caleb'in fikri hala en iyisidir.

  • İlgili konular