Почему я не могу установить родителя QObject в классе, для которого QObject является лишь косвенной базой? - PullRequest
5 голосов
/ 08 февраля 2012

У меня есть класс 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 родителя, есть ли еще способ использовать систему parent-child Qt для уничтожения моих производных элементов пакета?

1 Ответ

4 голосов
/ 08 февраля 2012

Вы не можете вызвать базовый конструктор QObject. Не имеет значения тип родительского параметра, но вызов QObject (QObject * parent). В этом случае вам следует вызвать BatchItem () без параметра и вызвать setParent (parent) в теле конструктора или перегрузить конструктор BatchItem (QObject *).

...