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

Maya中如何实现鼠标悬停时自动选中激活PyQt窗口/UI

Maya PyQt 工具窗口鼠标悬停自动激活方案

核心实现逻辑是通过重写窗口的鼠标进入事件,仅在鼠标移入工具窗口范围时自动激活窗口获取输入焦点,鼠标移走操作Maya主界面时焦点会自然交还给Maya,既不需要手动点击窗口激活快捷键,也不会因为窗口常驻激活状态导致快捷键全局冲突。

实现要点

  • 不要使用全局事件过滤器监听鼠标位置,这类写法容易和Maya本身的Qt事件循环冲突,引发莫名的界面卡死、快捷键响应异常问题,直接在自定义UI类里重写enterEvent即可
  • 事件触发时先判断窗口激活状态,已经处于激活状态时直接跳过,避免重复调用激活接口产生性能损耗
  • 激活窗口仅调用activateWindow()方法获取输入焦点,不要加强制置顶、强制抢焦点的全局属性,避免破坏Maya本身的窗口层级逻辑

可直接复用的代码示例

# 注意根据自己用的PyQt/PySide版本调整导入路径,Maya2022+默认搭载PySide2
from PySide2.QtCore import QEvent
from PySide2.QtWidgets import QDialog

class MyCustomTool(QDialog):
    def __init__(self, parent=None):
        super(MyCustomTool, self).__init__(parent)
        # 下方保留你原有的UI初始化、快捷键绑定逻辑即可
        self.init_ui()
        self.bind_shortcuts()

    def enterEvent(self, event: QEvent):
        # 鼠标移入窗口区域时自动激活窗口
        if not self.isActiveWindow():
            self.activateWindow()
        # 事件向上透传,不影响窗口内子控件的正常鼠标响应
        super(MyCustomTool, self).enterEvent(event)

避坑说明

  • 不要给窗口添加Qt.WindowStaysOnTopHint属性,也不要写定时器循环检测激活窗口,否则还是会出现UI快捷键和Maya原生快捷键全局冲突的问题
  • 如果UI中嵌入了Maya原生控件(如视口面板、大纲视图、属性编辑器等),需要给这类子控件调用setMouseTracking(True)开启鼠标追踪,避免鼠标移到内嵌控件上时enterEvent被子控件拦截,导致窗口激活失效
  • 不要在enterEvent中添加全量UI刷新、窗口位置重置这类重逻辑,否则鼠标快速划过窗口时会出现明显卡顿

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:06:33