隐藏小部件时无法调整窗口大小

Sho*_*lot 1 python resize pyqt pyside

我在这里找到了一些代码,其中显示了如何在隐藏小部件时调整窗口大小的示例,它对我有用。这是代码:

from PyQt4 import QtCore, QtGui
import sys

class MainWindow(QtGui.QWidget):
    def __init__(self):
        self.app = QtGui.QApplication(sys.argv)
        super(MainWindow, self).__init__()

        self.button = QtGui.QPushButton('Show/Hide')
        self.button.setCheckable(True)
        self.frame = QtGui.QFrame()
        self.frame.setFixedHeight(100)
        self.layout = layout = QtGui.QVBoxLayout()
        layout2 = QtGui.QVBoxLayout()
        self.setLayout(layout)
        self.frame.setLayout(layout2)

        layout.addWidget(self.button)
        layout.addWidget(self.frame)
        layout.addStretch(1)
        layout2.addWidget(QtGui.QLabel('Yoyoyo'))

        self.button.toggled.connect(self.clickAction)

    def startup(self):
        self.show()
        sys.exit(self.app.exec_())

    def clickAction(self):
        checked = self.button.isChecked()
        if checked:
            self.frame.show()
        else:
            self.frame.hide()
        QtCore.QTimer.singleShot(0, self.resizeMe)

    def resizeMe(self):
        self.resize(self.minimumSizeHint())
if __name__ == "__main__":
    myApp = MainWindow()
    myApp.startup()
Run Code Online (Sandbox Code Playgroud)

然后,我尝试通过分离 mainWindow 类和小部件类来修改它以匹配我现有的代码。这是执行此操作的代码。

from PySide import QtGui,QtCore
import sys



class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.w = testW(self)
        self.setCentralWidget(self.w)
        self.show()



class testW(QtGui.QWidget):
    def __init__(self,parent):
        super(testW,self).__init__()
        self.parent = parent
        self.button = QtGui.QPushButton('Show/Hide')
        self.button.setCheckable(True)
        self.button.setChecked(True);
        self.frame = QtGui.QFrame()
        self.frame.setFixedHeight(100)
        self.layout = layout = QtGui.QVBoxLayout()
        layout2 = QtGui.QVBoxLayout()
        self.setLayout(layout)
        self.frame.setLayout(layout2)

        layout.addWidget(self.button)
        layout.addWidget(self.frame)
        layout.addStretch(1)
        layout2.addWidget(QtGui.QLabel('Yoyoyo'))

        self.button.toggled.connect(self.clickAction)

    def clickAction(self):
        checked = self.button.isChecked()
        if checked:
            self.frame.show()
        else:
            self.frame.hide()
        QtCore.QTimer.singleShot(0, self.resizeMe)

    def resizeMe(self):
        self.resize(self.minimumSizeHint())

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myApp = MainWindow()
    sys.exit(app.exec_())
    #time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

运行第一个代码可以达到我想要的效果。隐藏小部件后,窗口大小会调整为正确的大小。当我隐藏和显示小部件时,代码的第二个实现不会缩小和展开窗口。这是因为 MainWindow 位于单独的类中吗?

apa*_*hev 5

  1. 对您的小部件使用尺寸策略。对于您的示例,您可以更改 UI 创建代码,如下所示:
class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.w = testW(self)
        self.w.setSizePolicy(
            QtWidgets.QSizePolicy.MinimumExpanding,
            QtWidgets.QSizePolicy.MinimumExpanding
        )
        self.setCentralWidget(self.w)
        self.show()
Run Code Online (Sandbox Code Playgroud)

请注意新的 setSizePolicy 调用,它说明Qt 布局引擎如何根据其内容更改小部件的大小。

  1. 不幸的是 QMainWindow 不会自动考虑sizeHint,但它会正确计算,因此您可以手动调整Size :
    def clickAction(self):
        checked = self.button.isChecked()
        if checked:
            self.frame.show()
        else:
            self.frame.hide()
        QtCore.QTimer.singleShot(0, self.parent.adjustSize)
Run Code Online (Sandbox Code Playgroud)

您不需要调整小部件本身的大小,因为它将根据策略调整大小。即使 sizeHint 也会自动计算,所以你只需要调用 QMainWindow 的 adjustmentSize 即可。

PS:我使用 PySide2 而不是 PySide,因此导入略有不同:

from PySide2 import QtWidgets, QtCore
Run Code Online (Sandbox Code Playgroud)