【问题标题】:I can't get window to resize when I hide a widget隐藏小部件时无法调整窗口大小
【发布时间】:2020-03-02 02:31:51
【问题描述】:

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

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()

然后我尝试通过分离 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)

运行第一个代码可以满足我的要求。隐藏小部件后,窗口将调整为正确的大小。当我隐藏和显示小部件时,代码的第二个实现不会缩小和扩大窗口。这是因为 MainWindow 在一个单独的类中吗?

【问题讨论】:

  • 您还需要调整 QMainWindow 的大小。一种可能的解决方案是在clickAction 方法内从testW 发出信号,并将其连接到像adjustSize 这样的MainWindow 插槽。我可以提交一个示例,但我使用 PyQt5,我认为信号/插槽语法不同。
  • @Alec 我没有发出信号,而是使用父变量调用了 adjustSize 方法,但它不起作用。

标签: python pyqt resize pyside


【解决方案1】:
  1. 为您的小部件使用size policies。对于您的示例,您可以按如下方式更改 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()

请注意新的 setSizePolicy 调用,它说 Qt layout engine 如何根据其内容更改小部件的大小。

  1. 很遗憾,QMainWindow 不会自动尊重sizeHint,但它是正确计算的,所以你可以手动adjustSize
    def clickAction(self):
        checked = self.button.isChecked()
        if checked:
            self.frame.show()
        else:
            self.frame.hide()
        QtCore.QTimer.singleShot(0, self.parent.adjustSize)

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

PS:我使用 PySide2 而不是 PySide,所以导入有点不同:

from PySide2 import QtWidgets, QtCore

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 2020-01-26
    相关资源
    最近更新 更多