5

を継承するクラスBatchItemQObject、から継承するいくつかのクラスがあり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ですが、それらはすべて親としてa を取ります。残念ながら、ドキュメントにも、名前付きウィジェット クラスの .cpp ファイルにも、その答えは見つかりませんでした。QAbstractScrollAreaQWidget

親を渡すことができないQObjectため、派生したバッチ アイテムを破棄するために Qt の親子システムを使用する方法はありますか?

4

1 に答える 1

4

QObject ベース コンストラクターを呼び出すことはできません。親パラメーターのタイプは関係ありませんが、QObject(QObject * parent) の呼び出しです。この場合、パラメーターなしで BatchItem() を呼び出し、コンストラクター本体で setParent(parent) を呼び出すか、BatchItem(QObject *) コンストラクターをオーバーロードする必要があります。

于 2012-02-08T14:55:04.953 に答える