我有一个继承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的父子系统销毁我的派生批处理项?
答案 0 :(得分:4)
您无法调用QObject基础构造函数。关于父参数的类型无关紧要,但调用QObject(QObject * parent)。你应该在这种情况下调用不带参数的BatchItem()并在构造函数体中调用setParent(parent),或者重载BatchItem(QObject *)构造函数。