繁体   English   中英

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

[英]PySide: What is the best way to resize the main window if one widget is hidden?

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

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

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

我想我不明白一些基本的东西,因为我无法得到理想的行为。

在此输入图像描述

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

self.resize(minimumSizeHint())

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

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

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

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

就像是 :

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

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

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

甚至比手动调整大小更简单的是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_()

好。 以下是一些代码,用于测试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%的成功。 因此,几乎在所有情况下,20毫秒肯定会成功,导致一个非常小的闪烁(可能也取决于你的布局)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM