在不调整其他小部件的大小的情况下将小部件添加到 window 的底部

Adding a widget to the bottom of a window without resizing other widgets

我有一个主要是一组按钮的 PyQt 应用程序。我希望底部有一个默认隐藏的 QTextEdit window,但用户可以关闭和打开。然而,我遇到的问题是,当用户打开 TextEdit 小部件时,按钮会调整大小。我希望所有按钮都保持不变,并且 QTextEdit 的状态不会在视觉上影响任何东西。第一张图片是我一直希望按钮的外观,无论 TextEdit 是打开还是关闭。第二个是当我隐藏 TextEdit 并且我不希望它这样做时它的样子。

我的代码:

class MainWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.central_widget = QWidget(self)
        self.main_layout = QVBoxLayout(self.central_widget)
        for i in range(5):
            btn = QPushButton()
            btn.setText("Button:" + str(i+1))
            btn.clicked.connect(self.toggle_log)
            self.main_layout.addWidget(btn)
        self.central_widget.setLayout(self.main_layout)
        self.setCentralWidget(self.central_widget)
        self.console = QTextEdit()
        self.main_layout.addWidget(self.console)
        self.show()

    def toggle_log(self):
        if self.console.isHidden():
            self.console.show()
        else:
            self.console.hide()

一种可能的解决方案是在显示或隐藏后立即重新计算尺寸:

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.central_widget = QWidget(self)
        self.main_layout = QVBoxLayout(self.central_widget)
        for i in range(5):
            btn = QPushButton()
            btn.setText("Button:" + str(i + 1))
            btn.clicked.connect(self.toggle_log)
            self.main_layout.addWidget(btn)
        self.central_widget.setLayout(self.main_layout)
        self.setCentralWidget(self.central_widget)
        self.console = QTextEdit()
        self.main_layout.addWidget(self.console)
        self.show()

    def toggle_log(self):
        if self.console.isHidden():
            QTimer.singleShot(0, self.resize_show)
            self.console.show()
        else:
            self.central_widget.updateGeometry()
            QTimer.singleShot(0, self.resize_hide)
            self.console.hide()

    def resize_show(self):
        self.resize(self.width(), self.sizeHint().height())

    def resize_hide(self):
        self.resize(self.width(), self.minimumSizeHint().height())