You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何捕获PyQt5中QSplitter的resizeEvent事件?

解决QSplitter拆分调整操作的捕获问题

方案1:直接使用QSplitter自带的splitterMoved信号(推荐)

QSplitter本身提供了专门针对拆分条拖动的信号,完全不需要和窗口的resizeEvent抢占事件,是最精准的解决方案:

# 假设已创建QSplitter实例self.splitter
self.splitter.splitterMoved.connect(self.handle_splitter_move)

# 对应的处理函数
def handle_splitter_move(self, index, position):
    # index为被拖动的拆分条索引,position是新位置
    # 在这里保存拆分状态,比如写入配置文件
    self.save_splitter_config(self.splitter.saveState())

这个信号只会在用户主动拖动拆分条时触发,不会被窗口调整大小这类无关操作干扰,比监听resizeEvent更高效准确。

方案2:子类化QSplitter并重写resizeEvent

如果必须通过事件方式处理,可以自定义QSplitter子类,重写它的resizeEvent,这样就不会和窗口的事件冲突:

from PyQt5.QtWidgets import QSplitter

class CustomSplitter(QSplitter):
    def resizeEvent(self, event):
        super().resizeEvent(event)  # 务必调用父类方法,保证组件正常功能
        # 处理拆分调整后的逻辑,比如保存状态
        self.parent().save_splitter_config(self.saveState())

# 使用自定义子类替代原生QSplitter
self.splitter = CustomSplitter(Qt.Horizontal)

方案3:给QSplitter安装事件过滤器

不想子类化的话,也可以在窗口类中给QSplitter安装事件过滤器,捕获它的Resize事件:

def __init__(self):
    # ... 其他初始化代码 ...
    self.splitter.installEventFilter(self)

def eventFilter(self, obj, event):
    if obj == self.splitter and event.type() == QEvent.Resize:
        # 处理QSplitter的resize事件
        self.save_splitter_config(self.splitter.saveState())
    return super().eventFilter(obj, event)

你之前用paintEvent作为临时方案确实不够合理,因为paintEvent会因组件重绘、窗口刷新等频繁触发,造成不必要的性能消耗,上面的方案都更可靠。

内容的提问来源于stack exchange,提问作者ullix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 03:10:11