PyQt: recebendo widgets para redimensionar automaticamente em um QDialog
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()
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.