2012-02-08 2 views
5

J'ai une classe BatchItem qui hérite QObject, ainsi que plusieurs classes qui héritent de BatchItem:Pourquoi ne puis-je pas définir un parent QObject dans une classe dont QObject n'est qu'une base indirecte?

#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 

Exemple d'une classe qui hérite de 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 

Et c'est le cpp correspondant:

#include "videobatchitem.h" 

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

/* ... */ 

Mais quand j'essaie de compiler, j'obtiens le fol erreur mugissement:

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

Bien sûr, je vois que cela est exact, comme QObject est seulement une base indirecte de VideoBatchItem. Mais pourquoi est-ce un problème? N'est-ce pas aussi le cas pour, par exemple, QAbstractScrollArea, qui hérite de QFrame, qui à son tour hérite de QWidget? Ils prennent tous un QWidget comme parent, bien que QAbstractScrollArea n'hérite qu'indirectement de QWidget. Malheureusement, je n'ai pas trouvé de réponse à cela dans la documentation ni dans les fichiers .cpp des classes de widgets nommés.

Étant donné que je ne peux pas passer un parent QObject, est-il toujours possible d'utiliser le système parent-enfant de Qt pour la destruction de mes éléments de traitement par lots dérivés?

Répondre

4

Vous ne pouvez pas appeler le constructeur de base QObject. Peu importe le type de paramètre parent mais l'appel de QObject (parent QObject *). Vous devriez appeler dans ce cas BatchItem() sans paramètre et appeler setParent (parent) dans le corps du constructeur, ou surcharger le constructeur BatchItem (QObject *).

+0

J'ai surchargé le ctor BatchItem, qui a aidé. THX! – steps

Questions connexes