Forum Programmation.python [résolu] PyQt5 problème de layout

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
2
2
juin
2020

Mise à jour : QWidget.setMinimumHeight() m'avait échappé, et a résolu le problème, désolé pour le dérangement :D

Bonjour !

Je profite d'un peu de temps libre pour m'autoformer à PyQt5, et je rencontre un problème (de débutant, j'imagine, mais je ne trouve la solution nulle part).

J'essaye d'insérer une QScrollArea en dessous d'un autre widget dans une layout verticale, et elle mange tout ce qui se trouve au dessus.

Voici le code (à peu près) minimal qui reproduit le problème.

#!/usr/bin/env python3

import sys

from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt



class AppWindow(QWidget):

    def __init__(self):

        super().__init__()

        self.layout = QVBoxLayout()

        self.layout.addWidget(SomeButtonsWidget())

        # commenter cette ligne pour voir réapparaitre les boutons
        self.layout.addWidget(SomeCheckBoxes())

        self.setLayout(self.layout)

        self.setGeometry(200, 200, 210, 200)

        self.show()



class SomeButtonsWidget(QWidget):

    def __init__(self):

        super().__init__()

        self.bt1 = QPushButton('bt 1', self)
        self.bt1.setGeometry(10, 10, 50, 30)

        self.bt2 = QPushButton('bt 2', self)
        self.bt2.setGeometry(70, 10, 50, 30)

        self.bt3 = QPushButton('bt 3', self)
        self.bt3.setGeometry(130, 10, 50, 30)



class SomeCheckBoxes(QScrollArea):

    def __init__(self):

        super().__init__()

        self.layout = QVBoxLayout()

        self.widget = QWidget()
        self.widget.setLayout(self.layout)

        self.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setWidgetResizable(True)
        self.setWidget(self.widget)

        self.layout.addWidget(QCheckBox('Choice 1'))
        self.layout.addWidget(QCheckBox('Choice 2'))
        self.layout.addWidget(QCheckBox('Choice 3'))



if __name__ == '__main__':

    app = QApplication(sys.argv)

    window = AppWindow()
    sys.exit(app.exec_())

J'ai donc dans ma fenêtre principale une QVBoxLayout qui contient 2 widgets, le premier est une poignée de boutons placés de manière absolue, le deuxième est une QScrollArea qui contient quelques checkbox. Le problèmes est que cette zone de scroll prend toute la place et fait disparaître mes boutons.

Si je me contente de mettre mes checkbox dans le propre layout verticale, pas de problème, mais du coup on peut plus scroller, ce qui est dommage.

(en remplaçant la classe SomeCheckBoxes par ce code par exemple)

class SomeCheckBoxes(QWidget):

    def __init__(self):

        super().__init__()

        self.layout = QVBoxLayout()

        self.setLayout(self.layout)

        self.layout.addWidget(QCheckBox('Choice 1'))
        self.layout.addWidget(QCheckBox('Choice 2'))
        self.layout.addWidget(QCheckBox('Choice 3'))

Voilà donc si quelqu'un à une idée pour m'aider, merci d'avance :)

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.