10 votes

PyQt : faire en sorte que les widgets se redimensionnent automatiquement dans un QDialog

J'ai du mal à faire en sorte que les widgets d'un QDialog soient redimensionnés automatiquement lorsque le dialogue lui-même est redimensionné.

Dans le programme suivant, la zone de texte se redimensionne automatiquement si vous redimensionnez la fenêtre principale. Toutefois, la zone de texte à l'intérieur de la boîte de dialogue conserve la même taille lorsque la boîte de dialogue est redimensionnée.

Existe-t-il un moyen de faire en sorte que la zone de texte de la boîte de dialogue se redimensionne automatiquement ? J'ai essayé d'utiliser setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) sur la boîte de dialogue elle-même et les deux widgets qu'elle contient, mais cela ne semble avoir aucun effet.

J'utilise Qt version 3.3.7 et PyQt version 3.5.5-29 sur openSuSE 10.2, si c'est pertinent.

import sys
from qt import *

# The numbers 1 to 1000 as a string.
NUMBERS = ("%d " * 1000) % (tuple(range(1,1001)))

# Add a textarea containing the numbers 1 to 1000 to the given
# QWidget.
def addTextArea(parent, size):
    textbox = QTextEdit(parent)
    textbox.setReadOnly(True)
    textbox.setMinimumSize(QSize(size, size*0.75))
    textbox.setText(NUMBERS)

class TestDialog(QDialog):
    def __init__(self,parent=None):
        QDialog.__init__(self,parent)
        self.setCaption("Dialog")
        everything = QVBox(self)

        addTextArea(everything, 400)
        everything.resize(everything.sizeHint())

class TestMainWindow(QMainWindow):
    def __init__(self,parent=None):
        QMainWindow.__init__(self,parent)
        self.setCaption("Main Window")
        everything = QVBox(self)

        addTextArea(everything, 800)

        button = QPushButton("Open dialog", everything)
        self.connect(button, SIGNAL('clicked()'), self.openDialog)        

        self.setCentralWidget(everything)
        self.resize(self.sizeHint())

        self.dialog = TestDialog(self)

    def openDialog(self):
        self.dialog.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainwin = TestMainWindow(None)
    app.setMainWidget(mainwin)
    mainwin.show()
    app.exec_loop()

7voto

Judge Maygarden Points 14964

QMainWindow a un comportement spécial pour le widget central qu'un QDialog n'a pas. Pour obtenir le comportement désiré, vous devez créer une fenêtre de type mise en page ajoutez la zone de texte à la mise en page et affectez la mise en page à la boîte de dialogue.

3voto

sdaau Points 6262

Juste pour ajouter une petite note à ce sujet - j'essayais d'avoir une fenêtre enfant créée à partir d'une application, qui est une QDialog contenant un seul QTextEdit comme un enfant/contenu - et je voulais que la QTextEdit pour redimensionner automatiquement chaque fois que le QDialog la taille de la fenêtre change. Cela semble avoir fait l'affaire pour moi avec PyQt4 :

def showTextWindow(self):

  #QVBox, QHBox # don't exist in Qt4

  dialog = QDialog(self)
  #dialog.setGeometry(QRect(100, 100, 400, 200))
  dialog.setWindowTitle("Title")
  dialog.setAttribute(QtCore.Qt.WA_DeleteOnClose)

  textbox = QTextEdit(dialog)
  textbox.setReadOnly(True)
  textbox.setMinimumSize(QSize(400, 400*0.75))
  textbox.setText("AHAAA!")

  # this seems enough to have the QTextEdit 
  # autoresize to window size changes of dialog!
  layout = QHBoxLayout(dialog)
  layout.addWidget(textbox)
  dialog.setLayout(layout)

  dialog.exec_()

2voto

Luke Woodward Points 20417

J'avais déjà envisagé d'utiliser un QLayout, mais sans succès. J'essayais de faire quelque chose comme

dialog.setLayout(some_layout)

mais je n'ai pas réussi à faire fonctionner cette approche, alors j'ai abandonné.

Mon erreur est que j'ai essayé de passer la mise en page à la boîte de dialogue alors que j'aurais dû passer la boîte de dialogue à la mise en page.

Ajout des lignes

layout = QVBoxLayout(self)
layout.add(everything)

à la fin de TestDialog.__init__ corrige le problème.

Merci à Monjardin de m'avoir incité à reconsidérer les mises en page.

1voto

hollahhoo Points 31

Vérifiez Redimensionnement automatique des widgets en Python QT C'est censé bien fonctionner.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X