如果隐藏了一个小部件,自动调整主窗口大小的最佳方法是什么?如果我再次显示窗口小部件,我还需要调整窗口大小。见下面的图片......
我应该在Qt Designer中为MainWindow(sizePolicy),centralwidget(sizePolicy,layoutSizeConstraint)和gridLayout(sizePolicy,layoutSizeConstraint)设置哪些设置?
如何隐藏textEdit小部件? self.textEditObject.setVisible(False)
有效:textEditObject不可见,但这是调整窗口大小的正确方法吗?
我想我不了解一些基本的东西,因为我无法达到预期的行为。
答案 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肯定都会成功,导致一个非常小的闪烁(可能也取决于你的布局)