Update ui_utils.py
This commit is contained in:
@@ -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"):
|
||||
"""
|
||||
|
Reference in New Issue
Block a user