2010-02-18 9 views
2

Je rencontre un problème avec la compréhension de l'utilisation du pointeur parent dans QT4.Utilisation du pointeur parent Qt4

class firstClass : public QWidget 
{ 
    Q_OBJECT 

public: 
    firstClass(QWidget *parent = 0); 
    ~firstClass(); 

    void doSomething(); 

private: 
    secondClass * myClass; 
}; 

class secondClass : public QWidget 
{ 
    Q_OBJECT 

public: 
    secondClass(QWidget *parent = 0); 
    void doSomethingElse(); 
}; 

Je veux appeler doSomething() méthode lors de l'exécution doSomethingElse(). Est-il possible de le faire en utilisant le pointeur parent? J'ai essayé parent->doSomething() mais cela ne fonctionne pas. Il semble que Qt Creator suggère seulement des méthodes de la classe QObject après parent->.

D'autre part, je ne peux pas écrire comme secondClass(firstClass *parent = 0); - compilator renvoie l'erreur:

Merci pour toutes suggestions.

+0

Tant que la définition de firstClass est #include avant de définir deuxième classe, la définition de votre constructeur de remplacement devrait compiler: ':: deuxième classe (firstClass * deuxième classe parent = 0): QWidget (parent) {}' Qu'est-ce que erreur de compilation obtenez-vous? –

+0

Je ne comprends pas pourquoi le compilateur ne vous laisserait pas passer le pointeur firstClass au constructeur de secondClass. –

+0

Les deux classes sont définies dans des fichiers différents et j'obtiens une erreur de secondClass.h - firstClass n'a pas été déclaré (même chose aveC#include "firstClass.h" et sans) – Moomin

Répondre

2

Si vous êtes certain que le parent de secondClass va toujours être firstClass alors vous pouvez le faire:

static_cast<firstClass *>(parent)->doSomething(); 

Vous pouvez également utiliser qobject_cast et assurez-vous que parent est en fait une instance de firstClass :

firstClass *myParent = qobject_cast<firstClass *>(parent); 
if(myParent){ 
    myParent->doSomething(); 
} 
+2

Le symbole 'parent' doit être remplacé par un appel à parentWidget() ou à parent() pour que ce code soit compilé. C'est parce que 'parent' n'est valide que dans la portée du constructeur, alors que la question demande comment appeler doSomething() de secondClass :: doSomethingElse(). –

1

La façon la plus Qt-ish de le faire serait d'utiliser des signaux et des machines à sous, au lieu d'essayer d'appeler directement une fonction différente.

class firstClass : public QWidget 
{ 
    Q_OBJECT 

public: 
    firstClass(QWidget *parent = 0); 
    ~firstClass(); 

public slot: 
    void doSomething(); 

private: 
    secondClass * myClass; 
}; 

class secondClass : public QWidget 
{ 
    Q_OBJECT 

public: 
    secondClass(QWidget *parent = 0); 
    void doSomethingElse() 
    { 
     // ... 
     emit (triggerDoSomething()); 
     // ... 
    } 

signal: 
    void triggerDoSomething(); 
}; 

firstClass::firstClass(QWidget *parent) : 
    QWidget(parent), myClass(new secondClass(this)) 
{ 
    // ... 
    bool connected = connect(myClass, SIGNAL(triggerDoSomething()), 
     SLOT(doSomething())); 
    assert(connected); 
}