Python 使用PyQt4调整对话框大小
我有以下代码示例:Python 使用PyQt4调整对话框大小,python,qt,pyqt,pyqt4,Python,Qt,Pyqt,Pyqt4,我有以下代码示例: import sys from PyQt4.QtGui import (QApplication, QHBoxLayout, QVBoxLayout, QDialog, QFrame, QPushButton, QComboBox) class Form(QDialog): def __init__(self, parent=None): super(Form, se
import sys
from PyQt4.QtGui import (QApplication, QHBoxLayout, QVBoxLayout, QDialog,
QFrame, QPushButton, QComboBox)
class Form(QDialog):
def __init__(self, parent=None):
super(Form, self).__init__(parent)
moreButton = QPushButton('moreButton')
moreButton.setCheckable(True)
resizeButton = QPushButton('Resize')
combo = QComboBox()
combo.addItems(['item1', 'item2'])
layout1 = QHBoxLayout()
layout1.addWidget(moreButton)
layout1.addWidget(resizeButton)
layout2 = QHBoxLayout()
layout2.addWidget(combo)
self.frame = QFrame()
self.frame.setLayout(layout2)
self.frame.hide()
layout3 = QVBoxLayout()
layout3.addLayout(layout1)
layout3.addWidget(self.frame)
moreButton.toggled.connect(self.frame.setVisible)
moreButton.clicked.connect(self.method)
resizeButton.clicked.connect(self.method)
self.setLayout(layout3)
self.resize(630, 50)
def method(self):
if self.frame.isVisible():
self.resize(630, 150)
else:
self.resize(630, 250)
app = QApplication(sys.argv)
form = Form()
form.show()
app.exec_()
我运行它,当moreButton单击时,组合框出现或消失。对话框的大小也会改变。但如果我将方法更改为:
def method(self):
if self.frame.isVisible():
self.resize(630, 150)
else:
self.resize(630, 50)
(为了在组合隐藏时设置初始大小),调整大小不起作用。但是,如果我单击resizeButton(它连接到同一个方法),则调整大小工作正常
我知道还有其他方法可以实现这样的结果(例如layout.setizeconstraint(QLayout.SetFixedSize)),但我想显式地声明大小
我做错了什么?你试过这个吗?除非我误解了,这就是你想要做的
def method(self):
if self.frame.isVisible():
self.resize(630, 150)
self.frame.setVisible(False)
else:
self.resize(630, 50)
编辑:最后的答案是layout3.setSizeConstraint(QLayout.SetNoConstraint)我猜您是在隐藏内容后,在有时间重新调整对话框的大小之前,尝试调整它的大小。因此,在调用
resize
时,它有一个minimumSize
,确保按钮和组合框可见。当您在一段时间后调用它时,它现在具有适当的mimimumize
,并正确响应
快速修复方法是在调整大小之前手动覆盖minimumSize
:
def method(self):
if self.frame.isVisible():
# uncomment below, if you like symmetry :)
# self.setMinimumSize(630, 150)
self.resize(630, 150)
else:
self.setMinimumSize(630, 50)
self.resize(630, 50)
但是,如果我要解决这个问题,我会将调整大小的工作留给布局,并使用
sizeConstraint
。这就是这些布局的目的。这个问题似乎是由事件处理顺序引起的
下面是一个简单的修复方法:
def method(self):
app.processEvents()
if self.frame.isVisible():
self.resize(630, 150)
else:
self.resize(630, 50)
这个问题和答案对我的情况很有帮助:使用QLayout/QVBoxLayout自动调整QDialog的大小,QLayout/QVBoxLayout包含给用户的可变大小内容/消息的QLabel,同时避免在整个QDialog容器的边界处出现双箭头光标。对话框本身的sizePolicy设置为Fixed,但箭头会出现,即使无法调整大小(不会移动)。即使内部布局可以自动/神奇地调整大小,但在布局上使用SetFixedSize(惊喜,惊喜)会使整个QDialog中那些恼人的双箭头消失
QDialog: QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
QLayout: setSizeConstraint(QLayout.SetFixedSize)
QLabel: QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
…现在,对话框的大小与标签中包含的卷大小相适应,但对话框本身(似乎)不可由用户调整大小,这有利于显示信息和错误消息
对我来说似乎违反直觉,所以我认为值得在这里为其他人添加内容。再详细一点
self.label = QtGui.QLabel(self)
self.label.sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
self.label.setSizePolicy(self.label.sizePolicy)
self.label.setMinimumSize(QtCore.QSize(450, 40))
self.label.setWordWrap(True)
self.verticalLayout = QtGui.QVBoxLayout(self)
# get rid of overall dialog resize arrows
self.verticalLayout.setSizeConstraint(QtGui.QLayout.SetFixedSize) # no resize arrows
self.verticalLayout.addWidget(self.label)
我已设法将框架设置为可见或不可见。“moreButton.toggled.connect(self.frame.setVisible)”对此负责。问题是,当我将框架设置为不可见时,我无法将对话框恢复到其初始大小,并且存在一些空白。哦,很抱歉,我现在想不出与layout3.setSizeConstraint(QLayout.SetNoConstraint)不同的解决方案,然后我正在更新我的答案,以便以后可能需要它。是的,这可能是原因。它与此更改一起正常工作。它还可以与上面提到的“layout3.setSizeConstraint(QLayout.SetNoConstraint)”一起使用。最后我注意到,在更复杂的情况下(因此更复杂的ui),只有这个答案可以很好地工作。非常感谢你!