setstandardbuttons qmessage multiple functions python qt pyqt qdialog

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.