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

2024-10-01 17:21:34 发布

您现在位置:Python中文网/ 问答频道 /正文

如果一个小部件被隐藏,自动调整主窗口大小的最佳方法是什么?我还需要调整窗口大小,如果我使小部件再次可见。请看下面的图片。。。在

在Qt Designer for MainWindow(sizePolicy)、centralwidget(sizePolicy,layoutsizestraint)和gridLayout(sizePolicy,layoutSizeConstraint)中应该设置什么设置?在

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

我想我不懂一些基本的东西,因为我无法得到想要的行为。在

enter image description here


Tags: 方法selffor部件图片qtdesignermainwindow
3条回答

好吧。下面是一些代码来测试Nejat建议的基于triarions示例的QTimer方法。虽然我不知道这是不是内贾特的意思,它目前对我最有效。在

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%的时间内工作,延迟1毫秒!只要我试了2ms就100%成功。所以20ms肯定会在几乎所有的情况下成功地诱导一个非常小的闪烁tho(可能也取决于你的布局)

比手动调整大小更简单的是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我实际上只是设法缩小了它,但没有完全缩小。也许比其他解决方案更好。在

^{pr2}$

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

self.resize(minimumSizeHint())

这会将窗口缩小到最小大小。在

如果只想缩小高度,可以执行以下操作:

^{pr2}$

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

就像:

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

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

另一个选择是单次触发一个QTimer,它调用一个可以将窗口调整到最小值的插槽。这样,当您调整窗口大小时,最小大小提示将正确计算。在

相关问题 更多 >

    热门问题