2010-09-21 2 views
9

Ce que j'essaie de faire, c'est qu'un widget puisse exister dans deux mises en page différentes, dans ce cas dans QHBoxLayout et dans QVBoxLayout. J'implémente un système qui permute dynamiquement entre les deux configurations lorsque l'orientation de l'écran d'un périphérique change.Qt: Même widget à l'intérieur de deux mises en page différentes

Actuellement je crée, disons un widget composite complexe appelé MyWidget et en ajoutant dans un deux configurations différentes:

MyWidget *wgt = new QWidget(); 
QVBoxLayout vlayout; 
QHBoxLayout hlayout; 

vlayout->addWidget(wgt); 
hlayout->addWidget(wgt); 

Maintenant, imaginez que les deux mises en page sont hébergés dans une mise en page « racine », et que cette disposition racine peut être redimensionnée dans un mode «paysage» plus large que haut, et dans un mode «portrait» plus grand que large. Le MyWidget s'affiche correctement uniquement dans la première mise en page dans laquelle il est ajouté, et lorsque les mises en page sont commutés, il affiche tout faux ou pas du tout.

Je ne sais pas si j'ai un sens ici, mais c'est mon problème. Peut-être que lorsque l'événement switch est appelé, tous les widgets enfants et les mises en page doivent être redimensionnés, donc cela semble toujours correct. Le seul problème est que je ne sais pas comment.

+0

question connexe: http://stackoverflow.com/questions/2990283/qt-change-qwidget-layout – rubenvb

Répondre

4

Ce n'est pas particulièrement facile à faire, mais c'est possible. Tout d'abord, je vous recommande de créer deux widgets différents, un pour le vertical et un pour l'horizontal, et de gérer les choses de cette façon. Si les données source sont correctement séparées de la classe d'interface utilisateur, vous devriez pouvoir le faire sans trop de problèmes, mais en encourant une surcharge de mémoire. Une façon de faire ce que vous désirez serait complètement remove the widgets d'une mise en page et ajoutez-les à l'autre lorsque vous avez besoin de changer l'arrangement sur l'écran, et changer la mise en page qui est ajouté au widget. Cela devrait entraîner le dessin des mêmes widgets d'une manière différente.

Une façon différente et plus complexe de gérer ceci (bien que potentiellement plus efficace) serait de write your own layout et de gérer les widgets en fonction du changement d'orientation.

+1

j'ai décidé d'écrire une méthode qui est appelée automatiquement lorsque les changements d'orientation, qui (après le retrait) ajoute les widgets à nouveau dans la mise en page. – Gerstmann

12

Ceci n'est pas une solution générale pour changer de disposition, mais une solution simple dans votre cas: changez simplement la direction de la boîte.

hlayout->setDirection(QBoxLayout::TopToBottom); 
// now your hboxlayout works as vertical layout 

hlayout->setDirection(QBoxLayout::LeftToRight); 
// and now it is horizontal again