PySide:如果隐藏了一个小部件,那么调整主窗口大小的最佳方法是什么?

时间:2015-01-28 21:28:44

标签: python qt resize pyside designer

如果隐藏了一个小部件,自动调整主窗口大小的最佳方法是什么?如果我再次显示窗口小部件,我还需要调整窗口大小。见下面的图片......

我应该在Qt Designer中为MainWindow(sizePolicy),centralwidget(sizePolicy,layoutSizeConstraint)和gridLayout(sizePolicy,layoutSizeConstraint)设置哪些设置?

如何隐藏textEdit小部件? self.textEditObject.setVisible(False)有效:textEditObject不可见,但这是调整窗口大小的正确方法吗?

我想我不了解一些基本的东西,因为我无法达到预期的行为。

enter image description here

3 个答案:

答案 0 :(得分:5)

隐藏窗口小部件后,您可以将窗口大小调整为minimumSizeHint()

self.resize(minimumSizeHint())

这会将窗口缩小到最小尺寸。

如果你只想缩小身高,那么你可以这样做:

self.resize(width(), minimumSizeHint().height())

但是您应该考虑在事件循环中处理某些事件之前不会计算最小大小。因此,当您隐藏窗口小部件时,只需处理一些迭代的事件循环,然后将其调整为最小值。

就像:

for i in range(0, 10):
      QApplication.processEvents()

self.resize(width(), minimumSizeHint().height())

另一种选择是单击QTimer,调用一个插槽,在该插槽中将窗口的大小调整到最小。这样,当您调整窗口大小时,将正确计算最小大小提示。

答案 1 :(得分:4)

比手动调整大小更简单的是QWidget.adjustSize()

以下是一个例子:

from PySide import QtGui

def hide_show():
    x.setVisible(not x.isVisible()) # toggles visibility of the label
    w.adjustSize() # adjusts size of widget

app = QtGui.QApplication([])

w = QtGui.QWidget()
l = QtGui.QVBoxLayout(w)
b = QtGui.QPushButton('Click me')
l.addWidget(b)
x = QtGui.QLabel('Some Text')
l.addWidget(x)
b.clicked.connect(hide_show)
w.show()

app.exec_()

如果你有一个QMainWidget我实际上只是设法缩小它但不完全缩小。也许比其他解决方案更好。

from PySide import QtGui

def hide_show():
    x.setVisible(not x.isVisible()) # toggles visibility of the label
    w2.adjustSize() # adjusts size of widget
    w.adjustSize() # adjusts size of main window

app = QtGui.QApplication([])

w = QtGui.QMainWindow()
w2 = QtGui.QWidget()
l = QtGui.QVBoxLayout(w2)
b = QtGui.QPushButton('Click me')
l.addWidget(b)
x = QtGui.QTextEdit('Some Text')
l.addWidget(x)
b.clicked.connect(hide_show)
w.setCentralWidget(w2)
w.show()

app.exec_()

答案 2 :(得分:0)

行。以下是一些代码,用于测试Nejat建议并基于Trilarions示例的 QTimer 方法。虽然我不知道Nejat是否意味着它对我来说效果最好。

from PySide import QtCore, QtGui


class TestWin(QtGui.QMainWindow):
    def __init__(self):
        super(TestWin, self).__init__()
        self.w2 = QtGui.QWidget()
        self.l = QtGui.QVBoxLayout(self.w2)

        self.h = QtGui.QHBoxLayout(self.w2)
        self.b = QtGui.QPushButton('hierarchic adjustSize()')
        self.b2 = QtGui.QPushButton('deferred resize()')
        self.h.addWidget(self.b)
        self.h.addWidget(self.b2)
        self.l.addLayout(self.h)

        self.x = QtGui.QTextEdit('Some Text')
        self.l.addWidget(self.x)
        self.b.clicked.connect(self.adjustSize_hide_show)
        self.b2.clicked.connect(self.qtimer_hide_show)
        self.setCentralWidget(self.w2)

    def toggleVis(self):
        self.x.setVisible(not self.x.isVisible())

    def adjustSize_hide_show(self):
        self.toggleVis()
        self.w2.adjustSize() # adjusts size of widget
        self.adjustSize() # adjusts size of main window

    def qtimer_hide_show(self):
        self.toggleVis()
        _timer = QtCore.QTimer()
        _timer.singleShot(30, self._resizeHeight)

    def _resizeHeight(self):
        self.resize(self.width(), self.minimumSizeHint().height())


if __name__ == '__main__':
    app = QtGui.QApplication([])
    win = TestWin()
    win.show()
    app.exec_()

这样您就不需要访问应用程序,实际上可以按特定方向调整大小。

我在这里依赖延迟并不是很舒服。但它仍然有90%的时间工作,延迟1ms!只要我尝试了2ms就取得了100%的成功。因此,几乎在所有情况下,20ms肯定都会成功,导致一个非常小的闪烁(可能也取决于你的布局)