6

我浏览了相关的问题,找不到任何能准确解决我所说的问题的东西,所以让我来描述一下。

我有一个类,假设 foo 需要有自己的插槽和信号,但还需要从 QXmlDefaultHandler 继承(听起来很奇怪,但我在尝试使用 QHttp 将网站直接读入 QBuffer 时遇到了这种情况)。

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

       Q_OBJECT
   public slots:
       void bar();
}

这段代码,如果伴随着一个 cpp 将 bar 连接到其他地方的信号,将不会编译。您将收到有关 QObject 的某些成员不是 QXmlDefaultHandler 成员的错误。此外,您不能移动 Q_OBJECT,否则您会因为未实现某些东西而收到 vtable 错误(继续!试试吧!)。

请查看我对(非常简单的)修复的回答。如果我认为你解释得比我好,我会接受投票给你作为接受的答案。

编辑:对于您的 c++ 和 Qt 兽医,如果您能更好地解释它,请发布答案。我花了很多时间查找此信息,所以如果您能做得比我更好,请帮助其他人。

4

2 回答 2

12

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

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

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

不支持使用 QObject 进行虚拟继承。

于 2009-09-28T20:50:20.187 回答
2
class foo: public QObject, public QXmlDefaultHandler
{
    public:
        foo();
        ~foo();
   Q_OBJECT
   public slots:
       void bar();
}

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

于 2009-09-28T20:42:26.293 回答