Pregunta

Tengo dificultades para cambiar el tamaño de los widgets en un QDialog automáticamente cuando se cambia el tamaño del cuadro de diálogo.

En el siguiente programa, el área de texto cambia de tamaño automáticamente si cambia el tamaño de la ventana principal. Sin embargo, el área de texto dentro del cuadro de diálogo se mantiene del mismo tamaño cuando se cambia el tamaño del cuadro de diálogo.

¿Hay alguna forma de hacer que el área de texto en el diálogo cambie de tamaño automáticamente? He intentado usar setSizePolicy (QSizePolicy.Ignored, QSizePolicy.Ignored) en el diálogo mismo y en los dos widgets, pero parece que no tiene ningún efecto.

Estoy usando Qt versión 3.3.7 y PyQt versión 3.5.5-29 en openSuSE 10.2, si eso es relevante.

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()
¿Fue útil?

Solución

QMainWindow tiene un comportamiento especial para el widget central que un QDialog no tiene. Para lograr el comportamiento deseado, debe crear un diseño , agregue el área de texto al Diseño y asigna el diseño al diálogo.

Otros consejos

Había visto usar un QLayout antes, pero no tuve suerte. Estaba tratando de hacer algo como

dialog.setLayout(some_layout)

pero no pude hacer que ese enfoque funcionara, así que me rendí.

Mi error fue que intentaba pasar el diseño al cuadro de diálogo cuando debería haber pasado el cuadro de diálogo al diseño.

Agregando las líneas

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

hasta el final de TestDialog .__ init__ soluciona el problema.

Gracias a Monjardin por pedirme que reconsidere los diseños.

Solo para agregar una pequeña nota sobre esto, estaba intentando que se generara una ventana secundaria a partir de una aplicación, que es un QDialog , que contiene un solo QTextEdit como child / content - y quería que el QTextEdit cambie de tamaño automáticamente cada vez que cambie el tamaño de la ventana de QDialog . Esto parece haber hecho el truco para mí con 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_()

Echa un vistazo a Resizer de Widget Automático de Python QT Se supone que funciona bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top