在对话框本身调整大小时,我很难自动调整QDialog中的小部件。
在以下程序中,如果调整主窗口的大小,textarea会自动调整大小。但是,在调整对话框大小时,对话框中的textarea保持相同的大小。
有没有办法让对话框中的textarea自动调整大小?我尝试在对话框本身和内部的两个小部件上使用setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
,但这似乎没有效果。
我在openSuSE 10.2上使用Qt版本3.3.7和PyQt版本3.5.5-29,如果这是相关的。
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()
答案 0 :(得分:4)
QMainWindow对QDialog没有的中央窗口小部件有特殊行为。要实现所需的行为,您需要创建layout,将文本区域添加到布局并将布局分配给对话框。
答案 1 :(得分:2)
之前我曾使用过QLayout,但没有运气。我试图做像
这样的事情dialog.setLayout(some_layout)
但是我无法使用这种方法,所以我放弃了。
我的错误是当我将对话框传递给布局时,我试图将布局传递给对话框。
添加行
layout = QVBoxLayout(self)
layout.add(everything)
到TestDialog.__init__
的末尾修复了问题。
感谢Monjardin提示我重新考虑布局。
答案 2 :(得分:2)
只是添加一个关于此的小注释 - 我试图从一个应用程序生成一个子窗口,这是一个QDialog
,包含一个QTextEdit
作为子/内容 - 我希望QTextEdit
在QDialog
窗口大小更改时自动调整大小。对于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_()
答案 3 :(得分:1)
查看Python QT Automatic Widget Resizer它可能会运作良好。