为什么我不能在QObject只是间接基础的类中设置QObject父类?

时间:2012-02-08 14:52:22

标签: qt parent-child qobject

我有一个继承BatchItem的课程QObject,还有几个继承自BatchItem的课程:

#ifndef BATCHITEM_H
#define BATCHITEM_H

#include <QObject>

class BatchItem : public QObject
{
    Q_OBJECT
public:
    virtual void start() = 0;
    virtual void stop() = 0;

signals:
    /* ... some signals ... */

};

#endif // BATCHITEM_H

继承自BatchItem的类的示例:

#ifndef VIDEOBATCHITEM_H
#define VIDEOBATCHITEM_H

#include "batchprocessing/batchitem.h"

#include <QtCore/QObject>

class VideoBatchItem : public BatchItem
{
    Q_OBJECT
public:
    explicit VideoBatchItem(/* ... */, QObject *parent = 0);

    void start();
    void stop();

private:
    /* ... some private member variables ... */
};

#endif // VIDEOBATCHITEM_H

这是相应的.cpp:

#include "videobatchitem.h"

VideoBatchItem::VideoBatchItem(/* ... */,
                               QObject *parent) :
    /* ... */,
    QObject(parent)
{
    /* ... */
}

/* ... */

但是当我尝试编译时,我收到以下错误:

error: type ‘QObject’ is not a direct base of ‘VideoBatchItem’

我当然认为这是正确的,因为QObject只是VideoBatchItem的间接基础。但为什么这是一个问题呢? 对于例如,情况也不是这样的。 QAbstractScrollArea,继承自QFrame,后者继承自QWidget?尽管QWidget仅间接地从QAbstractScrollArea继承,但它们都以QWidget作为其父级。 不幸的是,我无法在文档和命名小部件类的.cpp文件中找到答案。

由于我无法传递QObject父项,是否还有办法使用Qt的父子系统销毁我的派生批处理项?

1 个答案:

答案 0 :(得分:4)

您无法调用QObject基础构造函数。关于父参数的类型无关紧要,但调用QObject(QObject * parent)。你应该在这种情况下调用不带参数的BatchItem()并在构造函数体中调用setParent(parent),或者重载BatchItem(QObject *)构造函数。