PyQt: Widgets immer in einem QDialog automatisch auf die Größe
Frage
Ich habe Schwierigkeiten, Widgets in einem QDialog immer automatisch angepasst, wenn der Dialog selbst geändert wird.
Im folgende Programm, ändert die Größe der Textbereich automatisch, wenn Sie das Hauptfenster ändern. Allerdings bleibt das Textfeld im Dialog mit der gleichen Größe, wenn der Dialog der Größe verändert wird.
Gibt es einen Weg, um das Textfeld im Dialog automatisch die Größe? Ich habe versucht, setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
im Dialog mit sich selbst und den beiden Widgets innerhalb, aber das scheint keine Wirkung zu haben.
Ich bin mit Qt-Version 3.3.7 und PyQt Version 3.5.5-29 auf openSuSE 10.2, wenn das relevant.
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()
Lösung
QMainWindow hat ein spezielles Verhalten für das zentrale Widget, das eine QDialog nicht. Um das zu erreichen, das gewünschte Verhalten Sie benötigen ein Layout zu erstellen, fügen Sie den Textbereich der Layout und weisen Sie das Layout in den Dialog.
Andere Tipps
Ich habe mit einem QLayout sieht vor, habe aber kein Glück. Ich habe versucht, so etwas wie
zu tundialog.setLayout(some_layout)
, aber ich kann nicht, diesen Ansatz zu arbeiten, so gab ich auf.
Mein Fehler war, dass ich versuche, das Layout in den Dialog zu übergeben, wenn ich habe sein soll den Dialog an das Layout übergeben.
Das Hinzufügen der Zeilen
layout = QVBoxLayout(self)
layout.add(everything)
bis zum Ende des TestDialog.__init__
behebt das Problem.
Vielen Dank für die Aufforderung, mich Monjardin Layouts zu überdenken.
Nur eine kleine Notiz über diese hinzufügen - Ich habe versucht, ein Kind Fenster von einer Anwendung hervorgebracht zu haben, die ein QDialog
ist, ein einzelnes QTextEdit
als Kind / Inhalt enthalten - und ich wollte die QTextEdit
automatisch, um die Größe, wenn die QDialog
Fenstergröße ändert. Dies scheint den Trick für mich mit PyQt4
getan zu haben:
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_()
Schauen Sie sich Python QT Automatische Widget Resizer Es ist angenommen, gut zu funktionieren.