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()
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top