如何在显示/隐藏部件时避免QListWidget收缩,仅移动底部按钮?
问题:复选框切换组件可见性时保持上方部件位置固定,仅底部按钮移动
我需要通过复选框切换其下方标签/按钮组的可见性。当前切换时QListWidget会收缩,下方的删除、清除按钮及复选框会上移;期望效果是:QListWidget和删除、清除按钮保持尺寸和位置不变,仅底部的大按钮随标签/按钮组的显示/隐藏上下移动。
已尝试的方案
- 为QListWidget设置
setMinimumHeight()或setFixedHeight() - 将QListWidget与删除、清除按钮放入布局并设置高度
- 为部件设置Qt.AlignmentFlag的Top/Bottom属性
- 使用
SetColumnStretch和SetRowStretch
以上方法均未达到预期,要么部件移动幅度变小,要么出现重叠问题。
原测试代码
from PyQt6.QtWidgets import ( QApplication, QGridLayout, QHBoxLayout, QListWidget, QPushButton, QCheckBox, QWidget, QLabel ) class Widget(QWidget): def __init__(self, parent=None): super().__init__(parent) listwidget = QListWidget() del_btn = QPushButton(text="Delete item") clear_btn = QPushButton(text="Clear") checkbox = QCheckBox(text="Visibility toggle checkbox") hidden_label = QLabel(text="Hidden label") hidden_btn = QPushButton(text="Hidden button") visible_btn = QPushButton(text="Visible big button") group_layout = QHBoxLayout() group_layout.addWidget(hidden_label) group_layout.addWidget(hidden_btn) self.hidden_widget = QWidget() self.hidden_widget.setLayout(group_layout) main_layout = QGridLayout(self) main_layout.addWidget(listwidget, 0, 0, 1, 2) main_layout.addWidget(del_btn, 1, 0) main_layout.addWidget(clear_btn, 1, 1) main_layout.addWidget(checkbox, 2, 0) main_layout.addWidget(self.hidden_widget, 3, 0, 1, 2) main_layout.addWidget(visible_btn, 4, 0, 1, 2) listwidget.addItem("When clicking the checkbox toggle") listwidget.addItem("I want the hidden label\nand button to be visible") listwidget.addItem("But without the listbox height shrinking") listwidget.addItem("and the checkbox moving upward.") listwidget.addItem("The visible big button should\ninstead be moved downward.") listwidget.addItem("Possible?") checkbox.setChecked(True) self.hidden_widget.hide() visible_btn.setFixedHeight(50) visible_btn.setStyleSheet("font-size: 14pt;") checkbox.stateChanged.connect(self.checkbox_toggled) def checkbox_toggled(self): self.hidden_widget.setHidden(not self.hidden_widget.isHidden()) if __name__ == "__main__": app = QApplication([]) window = Widget() window.show() app.exec()
解决方法
通过动态调整窗口高度实现需求,修改checkbox_toggled方法,切换时根据隐藏组件的尺寸动态调整窗口高度(示例中48可通过self.hidden_widget.sizeHint().height()动态计算)。
修改后的代码:
def checkbox_toggled(self): state = not self.hidden_widget.isVisible() if state: # 显示隐藏组件时扩展窗口 self.hidden_widget.show() # 可替换为 self.hidden_widget.sizeHint().height() 动态获取高度 self.resize(self.width(), self.height() + 48) else: # 隐藏组件时收缩窗口 self.hidden_widget.hide() self.resize(self.width(), self.height() - 48)
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

