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()
War es hilfreich?

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 tun
dialog.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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top