PyQt: obtenir le redimensionnement automatique des widgets dans un QDialog
Question
Je ne parviens pas à redimensionner automatiquement les widgets d'un QDialog lorsque le dialogue est redimensionné.
Dans le programme suivant, la zone de texte est redimensionnée automatiquement si vous redimensionnez la fenêtre principale. Toutefois, la taille de la zone de texte de la boîte de dialogue reste la même lorsque celle-ci est redimensionnée.
Est-il possible de redimensionner automatiquement la zone de texte dans la boîte de dialogue? J'ai essayé d'utiliser setSizePolicy (QSizePolicy.Ignored, QSizePolicy.Ignored)
dans la boîte de dialogue elle-même et les deux widgets qu'il contient, mais cela semble n'avoir aucun effet.
J'utilise Qt version 3.3.7 et PyQt version 3.5.5-29 sous openSuSE 10.2, si cela 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()
La solution
QMainWindow a un comportement spécial pour le widget central, contrairement à QDialog. Pour obtenir le comportement souhaité, vous devez créer une mise en page , ajouter la zone de texte à la mise en page et attribuez la mise en page à la boîte de dialogue.
Autres conseils
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 ne pouvais pas obtenir cette approche au travail alors j'ai abandonné.
Mon erreur est que j'essayais de transmettre la mise en page à la boîte de dialogue alors que j'aurais dû la passer.
Ajout des lignes
layout = QVBoxLayout(self)
layout.add(everything)
à la fin de TestDialog .__ init __
corrige le problème.
Merci à Monjardin de m'avoir invité à reconsidérer les dispositions.
Juste pour ajouter une petite note à ce sujet - j'essayais de créer une fenêtre enfant à partir d'une application, qui est un QDialog
, contenant un seul QTextEdit
en tant que child / content - et je voulais que QTextEdit
soit automatiquement redimensionné chaque fois que la taille de la fenêtre QDialog
change. Cela semble avoir fait le tour 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_()
Découvrez l'outil de résolution automatique de widgets Python QT . Il est supposé qu'il fonctionne correctement.