Update ui_utils.py

This commit is contained in:
2025-05-07 01:36:40 +08:00
parent 2d17452bae
commit c3f8e8c5f0

View File

@@ -222,6 +222,23 @@ def load_icon(icon_name):
return QtGui.QIcon()
#============================================ SPLITTER ==========================================
def create_splitter(orientation=QtCore.Qt.Horizontal, parent=None):
"""
创建一个QSplitter对象并设置基本属性
Args:
orientation: 分割器方向,默认水平
parent: 父窗口对象
Returns:
QtWidgets.QSplitter: 创建的分割器对象
"""
splitter = QtWidgets.QSplitter(orientation, parent)
splitter.setOpaqueResize(True) # 拖动时实时显示
splitter.setChildrenCollapsible(False) # 防止子部件被完全折叠
splitter.setHandleWidth(2) # 设置分割条宽度
return splitter
def setup_splitter(ui_instance, splitter_name="main_splitter", equal_sizes=True):
"""
设置分割器的属性和大小,确保完全自由调整
@@ -236,37 +253,88 @@ def setup_splitter(ui_instance, splitter_name="main_splitter", equal_sizes=True)
"""
# 检查分割器是否存在
if not hasattr(ui_instance, 'splitters') or splitter_name not in ui_instance.splitters:
print(f"分割器 '{splitter_name}' 不存在")
return False
# 获取分割器
splitter = ui_instance.splitters[splitter_name]
if not isinstance(splitter, QtWidgets.QSplitter):
print(f"对象 '{splitter_name}' 不是QSplitter类型")
return False
# 设置分割器属性
splitter.setOpaqueResize(True)
splitter.setChildrenCollapsible(False)
splitter.setOpaqueResize(True) # 拖动时实时显示
splitter.setChildrenCollapsible(False) # 防止子部件被完全折叠
splitter.setHandleWidth(2) # 设置分割条宽度
# 设置伸缩因子和子部件属性
# 设置子部件属性
for i in range(splitter.count()):
# 设置伸缩因子
# 设置伸缩因子 - 所有子部件使用相同的伸缩因子
splitter.setStretchFactor(i, 1)
# 设置子部件属性
widget = splitter.widget(i)
if widget:
widget.setMinimumWidth(0)
widget.setMinimumHeight(0)
# 确保子部件可以自由调整大小
widget.setMinimumWidth(10) # 设置最小宽度而不是0防止完全消失
widget.setMinimumHeight(10) # 设置最小高度而不是0防止完全消失
widget.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
# 设置均等大小
if equal_sizes and splitter.count() > 0:
sizes = [1] * splitter.count()
# 计算每个部件应该的大小
total_size = splitter.width() if splitter.orientation() == QtCore.Qt.Horizontal else splitter.height()
size_per_widget = max(1, total_size // splitter.count())
sizes = [size_per_widget] * splitter.count()
# 立即设置大小
splitter.setSizes(sizes)
splitter.update()
# 延迟设置确保生效 - 使用两次定时器调用确保在UI完全加载后生效
QtCore.QTimer.singleShot(50, lambda: splitter.setSizes(sizes))
QtCore.QTimer.singleShot(200, lambda: splitter.setSizes(sizes))
# 连接分割器移动信号
splitter.splitterMoved.connect(lambda: on_splitter_moved(splitter))
return True
def on_splitter_moved(splitter):
"""
处理分割器移动事件
Args:
splitter: 被移动的分割器对象
"""
# 这里可以添加分割器移动后的处理逻辑
# 例如记录分割器位置或者调整其他UI元素
pass
def reset_splitter_sizes(splitter, equal_sizes=True):
"""
重置分割器大小,可选择设置均等大小
Args:
splitter: 分割器对象
equal_sizes: 是否设置均等大小
"""
if not isinstance(splitter, QtWidgets.QSplitter):
return
if equal_sizes and splitter.count() > 0:
# 计算每个部件应该的大小
total_size = splitter.width() if splitter.orientation() == QtCore.Qt.Horizontal else splitter.height()
size_per_widget = max(1, total_size // splitter.count())
sizes = [size_per_widget] * splitter.count()
# 设置大小
splitter.setSizes(sizes)
splitter.update()
# 延迟设置确保生效
QtCore.QTimer.singleShot(500, lambda: splitter.setSizes(sizes))
return True
QtCore.QTimer.singleShot(50, lambda: splitter.setSizes(sizes))
QtCore.QTimer.singleShot(200, lambda: splitter.setSizes(sizes))
def force_equal_splitter_sizes(ui_instance, splitter_name="main_splitter"):
"""