深圳市外贸网站建设多少钱,政务网站建设 紧急通知,室内装饰设计师国家职业技能标准,公司怎么搭建自己网站DockWidget窗口大小改变时#xff0c;内部的按钮能够自动重新排列#xff0c;以最佳方式利用可用空间。具体表现为#xff1a;1. 当水平空间足够时#xff0c;按钮排成一行2. 当水平空间不足时#xff0c;按钮自动换行程序环境Python 3.8.9pyside66.1.3pip install pyside…DockWidget窗口大小改变时内部的按钮能够自动重新排列以最佳方式利用可用空间。具体表现为1. 当水平空间足够时按钮排成一行2. 当水平空间不足时按钮自动换行程序环境Python 3.8.9pyside66.1.3pip install pyside66.1.3设计结构图解微信图片_2025-10-22_152148_073实现效果20251022_155729demo代码获取Giteedockwidget-demo百度网盘https://pan.baidu.com/s/1PRAjVGBtLQFZkWnZsJ2f2A?pwdeitiimage代码实现以下是完整的实现代码import reimport sysfrom PySide6.QtWidgets import QApplicationfrom ui_main_windowtest import *class MainWindow(QMainWindow, Ui_MainWindow):def __init__(self):super().__init__()self.setupUi(self)self.row 0 # 行self.col 0 # 列self.buttons_per_row 0 # 每行按钮数量self.scrollArea.widget().installEventFilter(self)# 获取布局参数self.h_spacing self.gridLayout_2.horizontalSpacing()self.v_spacing self.gridLayout_2.verticalSpacing()self.margins self.gridLayout_2.contentsMargins()# 获取第一个按钮的参考尺寸if self.gridLayout_2.count() 0:first_button self.gridLayout_2.itemAt(0).widget()self.button_width first_button.sizeHint().width() self.h_spacingself.button_height first_button.sizeHint().height() self.v_spacing 10 # 根据测试这里10容差可以防止出现程序无限执行rearrangeButtons方法的情况def eventFilter(self, obj, event):监控ScrollArea内widget的resize事件if event.type() QEvent.Resize:# 获取当前可用宽高available_height self.scrollArea.widget().size().height()available_width self.scrollArea.widget().size().width()# 检查是否需要重新排列按钮if available_height (self.row 1) * self.button_height and available_width self.button_width:self.rearrangeButtons()elif available_width (self.buttons_per_row 1) * self.button_width and available_height self.button_height:self.rearrangeButtons()return super().eventFilter(obj, event)def rearrangeButtons(self):重新排列按钮以适应新的窗口大小# 计算新的每行按钮数量available_width self.scrollArea.widget().width() - self.margins.left() - self.margins.right()new_buttons_per_row max(1, available_width // self.button_width)# 如果每行按钮数量没有变化则不需要重新排列if new_buttons_per_row ! self.buttons_per_row:self.buttons_per_row new_buttons_per_rowelse:return# 收集所有按钮buttons []for i in range(self.gridLayout_2.count()):item self.gridLayout_2.itemAt(i)if item.widget():buttons.append(item.widget())# 按按钮名称自然排序1, 2, 3, ..., 10, 11不排序每次重启程序顺序都会不一样buttons.sort(keylambda btn: [int(text) if text.isdigit() else text.lower()for text in re.split(([0-9]), btn.objectName())])# 清除当前布局while self.gridLayout_2.count():item self.gridLayout_2.takeAt(0)if item.widget():item.widget().setParent(None)# 重新排列按钮for i, button in enumerate(buttons):self.row i // self.buttons_per_rowself.col i % self.buttons_per_rowself.gridLayout_2.addWidget(button, self.row, self.col)if __name__ __main__:app QApplication(sys.argv)window MainWindow()window.show()sys.exit(app.exec())代码解析1. 初始化布局参数获取了布局的关键参数,这些参数用于准确计算可用空间和按钮尺寸self.h_spacing self.gridLayout_2.horizontalSpacing()self.v_spacing self.gridLayout_2.verticalSpacing()self.margins self.gridLayout_2.contentsMargins()2. 计算按钮尺寸我们以scrollArea第一个Qwidget为参考计算Qwidget的宽度和高度(所有Qwidget宽高必须统一)ps:这里变量名写成了button其实获取的是Qwidget的宽度和高度first_button self.gridLayout_2.itemAt(0).widget()self.button_width first_button.sizeHint().width() self.h_spacingself.button_height first_button.sizeHint().height() self.v_spacing 10注意这里加了10像素的容差这是为了避免在某些边界情况下出现无限循环的问题。3. 事件过滤器通过eventFilter监控ScrollArea内widget的resize事件def eventFilter(self, obj, event):if event.type() QEvent.Resize:# 获取当前可用宽高available_height self.scrollArea.widget().size().height()available_width self.scrollArea.widget().size().width()# 检查是否需要重新排列if available_height (self.row 1) * self.button_height and available_width self.button_width:self.rearrangeButtons()elif available_width (self.buttons_per_row 1) * self.button_width and available_height self.button_height:self.rearrangeButtons()return super().eventFilter(obj, event)4. 重新排列按钮rearrangeButtons方法是核心逻辑所在def rearrangeButtons(self):# 计算新的每行按钮数量available_width self.scrollArea.widget().width() - self.margins.left() - self.margins.right()new_buttons_per_row max(1, available_width // self.button_width)# 如果每行按钮数量没有变化则不需要重新排列if new_buttons_per_row ! self.buttons_per_row:self.buttons_per_row new_buttons_per_rowelse:return# 收集并排序按钮buttons []for i in range(self.gridLayout_2.count()):item self.gridLayout_2.itemAt(i)if item.widget():buttons.append(item.widget())# 使用正则表达式实现按钮名称的自然排序,可以通过命名的方式强制规定Qwidget组件顺序buttons.sort(keylambda btn: [int(text) if text.isdigit() else text.lower()for text in re.split(([0-9]), btn.objectName())])# 清除当前布局while self.gridLayout_2.count():item self.gridLayout_2.takeAt(0)if item.widget():item.widget().setParent(None)# 重新排列for i, button in enumerate(buttons):self.row i // self.buttons_per_rowself.col i % self.buttons_per_rowself.gridLayout_2.addWidget(button, self.row, self.col)注意事项按钮尺寸DockWidget下的所有Qwidget应具有相同的尺寸否则布局可能会不均匀容差设置代码中的10像素容差是经验值可能需要根据实际情况调整