2012-02-08 8 views
5

Ho una classe che eredita BatchItemQObject, oltre a diverse classi che ereditano da BatchItem:Perché non posso impostare un genitore QObject in una classe di cui QObject è solo una base indiretta?

#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 

Esempio di una classe che eredita da 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 

e questo è il corrispondente cpp:

#include "videobatchitem.h" 

VideoBatchItem::VideoBatchItem(/* ... */, 
           QObject *parent) : 
    /* ... */, 
    QObject(parent) 
{ 
    /* ... */ 
} 

/* ... */ 

Ma quando provo a compilare, ottengo il Errore di muggiti:

error: type ‘QObject’ is not a direct base of ‘VideoBatchItem’ 

Naturalmente vedo che questo è corretto, come QObject è solo una base indiretta della VideoBatchItem. Ma perché questo è un problema? Non è così anche per es. QAbstractScrollArea, che eredita da QFrame, che a sua volta eredita da QWidget? Prendono tutti uno QWidget come genitore, sebbene l'QAbstractScrollArea erediti solo indirettamente da QWidget. Sfortunatamente non sono riuscito a trovare una risposta a ciò né nella documentazione né nei file .cpp delle classi di widget nominate.

Poiché non riesco a passare un genitore QObject, esiste ancora un modo per utilizzare il sistema padre-figlio di Qt per la distruzione dei miei elementi batch derivati?

risposta

4

Non è possibile chiamare il costruttore di base QObject. Non ha importanza sul tipo di parametro parent ma chiama QObject (QObject * parent). In questo caso, è necessario chiamare BatchItem() senza parametro e chiamare setParent (parent) nel corpo del costruttore o sovraccaricare il costruttore BatchItem (QObject *).

+0

Ho sovraccaricato il sensore BatchItem, che ha aiutato. Grazie! – steps

Problemi correlati