【问题标题】:Why can't I set a QObject parent in a class of which QObject is only an indirect base?为什么我不能在 QObject 只是间接基类的类中设置 QObject 父级?
【发布时间】:2012-02-08 23:55:42
【问题描述】:

我有一个继承 QObject 的类 BatchItem,还有几个继承自 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 的父子系统来销毁我派生的批处理项?

【问题讨论】:

    标签: qt parent-child qobject


    【解决方案1】:

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

    【讨论】:

    • 我重载了 BatchItem ctor,这很有帮助。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 2015-07-31
    • 2010-12-19
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多