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),只有这个答案可以很好地工作。非常感谢你!