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

5

我有一个类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,而QFrame又继承自QWidget。他们都以QWidget作为父对象,尽管QAbstractScrollArea只是间接继承自QWidget。不幸的是,我在命名小部件类的文档和.cpp文件中都没有找到答案。
由于我不能传递QObject作为父对象,那么还有没有办法使用Qt的父子系统来销毁我的派生批处理项?
1个回答

4

您不能调用QObject基类构造函数。无论父级参数的类型如何,都不能调用QObject(QObject *parent)。在这种情况下,应该不带参数调用BatchItem(),并在构造函数体中调用setParent(parent),或重载BatchItem(QObject *)构造函数。


我重载了BatchItem的构造函数,这很有帮助。谢谢! - steps

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接