2009-09-28 26 views
6

我翻看相关的问题,找不到任何能解决我正在谈论的问题,所以让我来描述一下。在Qt中,如何使用Q_OBJECT插槽和具有多重继承的信号?

我有一个类,让我们说foo需要有自己的插槽和信号,但也需要从QXmlDefaultHandler继承(听起来很奇怪,但是当我尝试使用QHttp直接读取网站时遇到这种情况一个QBuffer)。

class foo: public QXmlDefaultHandler, public QObject 
{ 
    public: 
     foo(); 
     ~foo(); 

     Q_OBJECT 
    public slots: 
     void bar(); 
} 

这段代码,如果伴随着一个cpp连接栏到其他地方的信号,将不会编译。你会得到有关QObject的一些成员不是QXmlDefaultHandler成员的错误。另外,你不能移动Q_OBJECT,否则你会因为不执行某些事情而出现vtable错误(继续尝试!)。

请参阅我的答案(非常简单)修复。如果我认为你比我更好地解释它,我会接受你的投票。

编辑:对于你C++和Qt兽医,请发表一个答案,如果你能更好地解释它。我花了很多时间查看这些信息,所以如果你能比我做得更好,请帮助其他人。

回答

12

documentation for moc指出,在多重继承的情况下,提供的QObject类应首先出现

如果使用多重继承, 商务部假定第一继承 类是QObject的一个子类。另外, 请确保只有第一个继承的 类是QObject。

// correct 
class SomeClass : public QObject, public OtherClass 
{ 
    ... 
}; 

QObject的虚拟继承不支持 。

2
class foo: public QObject, public QXmlDefaultHandler 
{ 
    public: 
     foo(); 
     ~foo(); 
    Q_OBJECT 
    public slots: 
     void bar(); 
} 

就像听起来那么简单,如果你不把第一个QObject放在继承列表中,这个任务是不可能的。这是Qt的元对象系统的限制。如果你不这样做,编译器将尝试应用QObject的一些成员作为QXmlDefaultHandler的一部分。