2009-03-12 8 views
2

J'ai une hiérarchie simple de widgets: GraphWidget -> MotionWidget -> NodeWidget. Je suis nouveau à Qt, donc je ne suis pas tout à fait sûr de la façon dont certains intérieurs fonctionnent encore. Fondamentalement, GraphWidget crée un seul MotionWidget M et définit le parent de M à lui-même. M puis s'en va et crée un tas de NodeWidgets. Cependant, les NodeWidgets ne sont jamais peints et leur fonction paintEvent() n'est pas appelée.Pourquoi QWidget :: paintEvent n'est pas appelé?

J'ai essayé de créer MotionWidget directement, sans GraphWidget et tout fonctionne. Alors pourquoi les choses se cassent si j'ajoute GraphWidget à la hiérarchie?

Voici une pâte avec les bits de code pertinents de mon projet. J'ai également inclus la sortie de GraphWidget :: dumpObjectTree() en haut.

Edit: avez oublié d'inclure le lien de la pâte;) http://rafb.net/p/Zp39CF94.html

Mise à jour: J'enroulai MotionWidget dans une mise en page.

Avant:

GraphWidget :: GraphWidget(QWidget *parent) : QWidget(parent) 
{ 
    setFixedSize(500, 500); 

    MotionWidget *n = new MotionWidget(5, this); 
} 

Après

GraphWidget :: GraphWidget(QWidget *parent) : QWidget(parent) 
{ 
    setFixedSize(500, 500); 

    QVBoxLayout *l = new QVBoxLayout; 

    MotionWidget *n = new MotionWidget(5); 

    l->addWidget(n); 

    setLayout(l); 
} 

Maintenant, ce dernier fonctionne. C'est à dire. tout est dessiné. La question devient alors ... Pourquoi? Pourquoi cela n'a-t-il pas fonctionné dans le premier cas, mais a fonctionné dans la seconde?

+0

Est-ce que placer 'this-> setGeometry (parent-> rect())' dans le constructeur MotionWidget supprime le besoin d'une autre disposition? Que faire si vous appelez 'n-> show()' après l'avoir créé? –

Répondre

3

Je ne suis pas d'accord avec Aiua's answer. Passer le parent à un objet ajoutera l'enfant à la hiérarchie visuelle. (Sinon, utiliser Designer pour créer un widget incluant d'autres, mais avec un positionnement absolu, ne fonctionnerait pas.) Cependant, il y avait probablement d'autres facteurs empêchant la peinture de se produire. En raison du fait que la mise en page a fait les choses, je vais deviner que dans les deux versions, MotionWidget n'a pas de taille d'ensemble. Cela signifierait dans le premier exemple qu'il serait de taille à 0x0 pixels, que Qt optimisera en essayant de peindre. Dans le second exemple, la disposition contrôle la taille des widgets qui y sont ajoutés, et ainsi agrandir MotionWidget, et ainsi commencer à recevoir des événements de peinture à nouveau. Pour corriger cela, vous pouvez définir la taille explicitement comme vous le faites pour GraphWidget, ou vous pouvez faire un certain dimensionnement dynamique en fonction de la taille du parent, ou GraphWidget pourrait contrôler la taille ou l'un des nombreux choix. Les mises en page peuvent être bien aussi, mais ne sont pas absolument nécessaires.

+0

Vous avez absolument raison. Désolé pour ma mauvaise réponse. Je n'utilise jamais le positionnement absolu, donc j'ai oublié que dans ce cas, il utilise le widget parent pour la hiérarchie visuelle. – Aiua

Questions connexes