8
votes

Échanger un widget avec un autre dans qt

Quelle est la meilleure façon de "échanger" un qgraphicswidget avec un autre dans une vue existante? J'ai un widget d'une arborescence et un widget d'étiquettes, et je souhaite qu'ils occupent le même espace à des moments différents. Spécifiquement, lorsqu'il y a une erreur, je veux le montrer dans l'étiquette et quand il n'y a pas d'erreur, je veux montrer l'arbre.

J'ai essayé de masquer programmatiquement une et montrant l'autre avec masquer () et show () , mais le problème est que le widget caché occupe l'espace dans mon Qgraphicsinearlayout même quand il est caché, laissant un écart vide. Alternativement, je suppose que je pouvais ajouter et supprimer les widgets de la disposition, mais cela semble lourd puisqu'il implique un changement de propriété des widgets et je devrais enregistrer leur position dans la mise en page afin que je puisse les insérer dans le bon endroit.

Dans Java Swing, j'utiliserais un Cardlayout pour y parvenir, mais je ne vois pas d'équivalent dans Qt.

mise à jour: j'ai découvert qstactactedwidget . Cependant, je travaille avec un qgraphicssscène et donc mes widgets n'hérient pas de qwidget mais plutôt qgraphicswidget , donc je ne peux donc pas les ajouter à un qstackedwidget .


0 commentaires

4 Réponses :


0
votes

Lorsque vous ajoutez un QWidget à une mise en page, le propriétaire de la mise en page ne prendra pas la propriété de votre widget. Vous devez ajouter votre widget comme enfant d'un autre qwidget pour cela (passez généralement le parent dans le constructeur de l'enfant).

Supprimer un widget du lyout ne le supprimera que du comportement d'affichage du propriétaire de la mise en page.

Dans votre cas, vous pouvez supprimer le widget de la mise en page et le cacher. Si vous souhaitez l'afficher à nouveau, montrez-le et ajoutez le widget à la mise en page. Pour l'insérer au bon endroit, vous devez sauver sa place lors de la suppression.

espoir que cela aide


3 commentaires

Vous avez un peu mal à propos de la propriété des widgets en présentation - tous les enfants sont automatiquement réparais lorsque la mise en page est installée sur le widget via la méthode SetLayout. Donc, vous n'avez pas besoin de spécifier le parent pour les widgets des enfants.


Ceci est fondamentalement l'approche "lourde" que j'ai décrite dans la question. J'espère que quelque chose d'un peu plus simple. (Je pense que CHALUP est juste sur la question de la propriété. Le DOC pour QGraphicSineArlayOut.remoVeat dit que la propriété est transférée à l'appelant.)


Avez-vous essayé d'utiliser une mise en page personnalisée dans laquelle les widgets cachés seront ignorés pendant le positionnement? Cela peut faire le tour.



3
votes

Comment sur Qstackedwidget ?

La classe QstackedWidget fournit une pile de widgets où un seul widget est visible à la fois.


1 commentaires

Au premier passé, cela semble être la solution idéale. Mais je travaille avec un qgraphicssscène et mes widgets n'hérent pas de qwidget mais plutôt qgraphicswidget, donc je ne peux donc pas les ajouter à un Qstackedwidget. Je vais mettre à jour la question pour que cela soit clair.



1
votes

Vous pouvez facilement imiter facilement un qstackedwidget par vous-même. Créez votre propre widget (toutefois que vous souhaitez, soit à partir de qwidget ou de qgraphicswidget et mettez-le là où vous souhaitez que les deux widgets différents apparaissent. Mettez vos widgets là-bas, et Permettez-lui de contrôler lequel est visible. Avec un peu de travail, vous pouvez même le rendre assez générique pour être utilisé comme une version qgraphicswidget de qstactactedwidget . .


3 commentaires

Comment est-ce différent de ma première tentative d'appel à la peau () et de montrer () sur les widgets? Le problème est l'écart vide laissé dans la mise en page où réside le widget caché.


@ROB H: La différence est que dans ce cas, vous avez un widget occupant l'espace dans votre présentation linéaire. Ce widget change ce qu'il montre, ce qui ne devrait pas affecter l'espacement de quoi que ce soit. J'ai laissé impliquer que le widget contenant les deux autres ne devrait pas utiliser une mise en page, mais simplement positionner les deux autres où ils devraient être et montrer / cacher chacun le cas échéant.


Ahh, maintenant je l'obtiens. +1 Pour une idée intéressante, bien que je pense que je vais aller avec la réponse de la mise en page d'ancrage si je peux le faire fonctionner.



1
votes

Il y a quelque chose appelé QGraphicsanchorLayout . Vous définissez des "ancrages" (les distances entre les bords ou les coins d'éléments), vous pouvez donc essayer de définir les mêmes ancres pour votre arbre et votre étiquette et de cacher les widgets de manière appropriée. Étant donné que les deux widgets occuperont la même zone, il ne devrait y avoir aucune lacune après avoir caché un élément.


1 commentaires

Hmm ... Je vais examiner cela et faire rapport. Merci pour le pointeur!