Domanda

Ho difficoltà a ottenere il ridimensionamento automatico dei widget in un QDialog quando viene ridimensionato il dialogo stesso.

Nel seguente programma, l'area di testo si ridimensiona automaticamente se si ridimensiona la finestra principale. Tuttavia, l'area di testo all'interno della finestra di dialogo rimane della stessa dimensione quando la finestra di dialogo viene ridimensionata.

Esiste un modo per ridimensionare automaticamente l'area di testo nella finestra di dialogo? Ho provato a usare setSizePolicy (QSizePolicy.Ignored, QSizePolicy.Ignored) nella finestra di dialogo stessa e nei due widget all'interno, ma questo sembra non avere alcun effetto.

Sto usando Qt versione 3.3.7 e PyQt versione 3.5.5-29 su openSuSE 10.2, se pertinente.

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()
È stato utile?

Soluzione

QMainWindow ha un comportamento speciale per il widget centrale rispetto a un QDialog. Per ottenere il comportamento desiderato è necessario creare un layout , aggiungere l'area di testo al layout e assegnare il layout alla finestra di dialogo.

Altri suggerimenti

Avevo già provato a utilizzare un QLayout ma non avevo avuto fortuna. Stavo cercando di fare qualcosa del genere

dialog.setLayout(some_layout)

ma non sono riuscito a far funzionare questo approccio, quindi ho rinunciato.

Il mio errore è stato che stavo cercando di passare il layout alla finestra di dialogo quando avrei dovuto passare la finestra di dialogo al layout.

Aggiunta delle linee

layout = QVBoxLayout(self)
layout.add(everything)

alla fine di TestDialog .__ init__ risolve il problema.

Grazie a Monjardin per avermi spinto a riconsiderare i layout.

Solo per aggiungere una piccola nota a riguardo: stavo cercando di far nascere una finestra figlio da un'applicazione, che è un QDialog , contenente un singolo QTextEdit come figlio / contenuto - e volevo che il QTextEdit si ridimensionasse automaticamente ogni volta che cambia la dimensione della finestra QDialog . Questo sembra aver fatto il trucco per me 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_()

Dai un'occhiata a Python QT Automatic Widget Resizer Supponiamo che funzioni bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top