web-dev-qa-db-fra.com

Disposition Qt, redimensionner au minimum après les changements de taille de widget

En gros, j'ai un QGridLayout avec quelques widgets dedans. Les plus importantes sont 2 étiquettes que j'utilise pour dessiner des images à l'écran. Eh bien, si l'utilisateur le souhaite, il peut modifier la résolution des images entrantes, forçant ainsi les étiquettes à se redimensionner.

Supposons que la taille initiale de l'étiquette soit 320x240. L'utilisateur change le VideoMode en 640x480, L'étiquette et l'interface graphique entière se redimensionne parfaitement. Mais lorsque l'utilisateur revient à 320x240, L'étiquette se rétrécit, mais la disposition/fenêtre ne le fait PAS.

J'ai joué avec sizePolicies et sizeHints et resize(0,0), mais rien n'a fait l'affaire. Quelqu'un pourrait-il m'aider avec ça?

Voici quelques captures d'écran pour clarifier le problème:

Here, everything is okaystill, 640 x 480 resizes perfectlybut here, the layout is too big.

24
Hafnernuss

Vous devez définir la contrainte de taille de la mise en page contenant tous vos widgets sur "SetFixedSize". Bien que le nom ne semble pas fonctionner, il garantit que votre mise en page n'utilisera que l'espace dont il a besoin. Vous n'aurez pas le problème comme vous le faites dans votre deuxième capture d'écran.

Exemple:

mainLayout.setSizeConstraint(QLayout::SetFixedSize);
45
user929404

QLayout :: setSizeConstraint (QLayout :: SetFixedSize) résout bien ce problème lorsque vous préférez garder la taille de votre widget fixe à tout moment - c'est-à-dire, si vous souhaitez qu'il soit toujours fixé à sa taille "compactée" (qui peut encore varient en fonction de la taille des widgets enfants). C'est ce que signifie le "fixe": "fixe" à la bonne taille, même si celle-ci varie. (En termes de Qt, ce que j'appelle la taille "compactée" est simplement le sizeHint du widget.)

Mais une contrainte peut être une solution trop forte dans certains cas. En particulier, si vous l'appliquez à une fenêtre de niveau supérieur, l'utilisateur ne sera pas libre de redimensionner la fenêtre. Si vous n'aimez pas cela, vous pouvez à la place effectuer l'opération "set size to sizeHint" instantanément chaque fois que cela est nécessaire, plutôt que de l'imposer comme une contrainte implacable. La façon de le faire est d'appeler QWidget :: adjustSize ().

http://doc.qt.io/qt-5/qwidget.html#adjustSize

Notez que si le conteneur dont les enfants changent de taille n'est pas la fenêtre de niveau supérieur, alors adjustSize () peut devoir être appelé récursivement sur le conteneur et ses parents. (Dans mon cas, je devais le faire de toute façon. J'ai également essayé le schéma de contrainte de taille et j'ai constaté que l'application de la contrainte uniquement au niveau le plus élevé a réussi à compacter tous les niveaux. Je n'ai pas assez de connaissances sur Qt pour commenter utilement sur ces observations, je les partage donc.)

8
mjwach

Vous devez stocker la taille d'origine de la fenêtre parent de votre widget avant d'appliquer des modifications à la disposition et la restaurer lorsque l'utilisateur revient à l'original.

Notez que vous devez travailler avec la taille fenêtre parent du widget et non avec la taille parent du widget.

dans votre widget avant d'appliquer les modifications de mise en page:

minimumWindowSize = this->window().size();

lorsque vous avez terminé de réorganiser le widget à la taille compacte

this->window().resize(minimumWindowSize);
2
Pierluigi

C'est exactement ce que je fais dans le projet mu. La résolution du système d'exploitation n'a pas d'importance. Je n'ai qu'à avoir un widget pour rendre la vidéo ou l'image dans votre cas.

void MainWindow::resizeEvent(QResizeEvent* event)
 {
   QMainWindow::resizeEvent(event);
   if ((player != 0) && ((player->isPlaying()) || player->isLoaded() || player>isLoaded())){
     renderer->resize(ui->mainVideoWidget->width(),ui->mainVideoWidget->height());
     resizeFilter();

 }
}
1
AntonD