Pergunta

Eu estou tendo dificuldade em obter os widgets em uma QDialog redimensionada automaticamente quando o diálogo em si é redimensionada.

No programa seguinte, o textarea redimensiona automaticamente se redimensionar a janela principal. No entanto, o textarea dentro das estadias de diálogo do mesmo tamanho quando o diálogo é redimensionado.

Existe alguma maneira de fazer o textarea no redimensionamento de diálogo automaticamente? Eu tentei usar setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) no próprio diálogo e os dois widgets dentro, mas que parece não ter nenhum efeito.

Eu estou usando Qt versão 3.3.7 e PyQt versão 3.5.5-29 no openSUSE 10.2, se isso é 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()
Foi útil?

Solução

QMainWindow tem um comportamento especial para o widget central que um QDialog não. Para obter o comportamento desejado, você precisa criar uma disposição , adicione área de texto para o layout e atribuir o layout para o diálogo.

Outras dicas

Eu tinha olhado usando um QLayout antes, mas não teve sorte. Eu estava tentando fazer algo como

dialog.setLayout(some_layout)

mas eu não poderia obter essa abordagem ao trabalho, então eu desisti.

O meu erro foi que eu estava tentando passar o layout da janela de quando eu deveria ter sido passando de diálogo para o layout.

Adicionando as linhas

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

para o fim de correções TestDialog.__init__ o problema.

Graças à Monjardin para levando-me a reconsiderar layouts.

Apenas para adicionar uma pequena nota sobre isso - eu estava tentando ter uma janela filho gerado a partir de uma aplicação, que é um QDialog, contendo uma única QTextEdit como uma criança / conteúdo - e eu queria que o QTextEdit para redimensionar automaticamente sempre que o alterações de tamanho janela QDialog. Esta parece ter feito o truque para mim com 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_()

Confira Python QT automática Widget Resizer É supor para trabalhar bem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top