PyQt: obtener widgets para cambiar el tamaño automáticamente en un QDialog
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()
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.