python - qmessage - PyQt: obtener widgets para cambiar el tamaño automáticamente en un QDialog
setstandardbuttons pyqt (4)
Tengo dificultades para obtener widgets en un QDialog redimensionado automáticamente cuando se cambia el tamaño del cuadro de diálogo.
En el siguiente programa, textarea cambia el tamaño automáticamente si cambia el tamaño de la ventana principal. Sin embargo, el área de texto dentro del diálogo permanece 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 el tamaño automáticamente? Intenté usar setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
en el cuadro de diálogo 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()
Solo para añadir una pequeña nota sobre esto, estaba intentando que se QDialog
una ventana hija de una aplicación, que es un QDialog
, que contiene un solo QTextEdit
como elemento secundario / contenido, y quería que el QTextEdit
tamaño automáticamente siempre que el tamaño de la ventana de QDialog
cambios. 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_()
Había analizado el uso de QLayout antes, pero no tuve suerte. Estaba tratando de hacer algo como
dialog.setLayout(some_layout)
pero no pude lograr que ese enfoque funcionara, así que me di por vencido.
Mi error fue que estaba tratando de pasar el diseño al diálogo cuando debería haber estado pasando el diálogo al diseño.
Agregar las líneas
layout = QVBoxLayout(self)
layout.add(everything)
hasta el final de TestDialog.__init__
soluciona el problema.
Gracias a Monjardin por incitarme a reconsiderar los diseños.
QMainWindow tiene un comportamiento especial para el widget central que un QDialog no tiene. Para lograr el comportamiento deseado, debe crear un diseño , agregar el área de texto al diseño y asignar el diseño al diálogo.
Echa un vistazo a Python QT Automatic Widget Resizer Se supone que debe funcionar bien.