在Maya的PyQt应用中,工具提示或状态栏无法工作

0 投票
3 回答
2099 浏览
提问于 2025-04-16 22:03

我在Autodesk Maya中用Python启动了一个PyQt4的QDialog对话框。我想在这个窗口里加一个状态栏,或者如果需要的话,加一些工具提示。不过,Maya似乎不太支持这两种方式。我按照这里的方法实现了:

http://www.qtcentre.org/threads/10593-QDialog-StatusBar

如果我单独运行我的应用程序,状态栏和工具提示都能正常工作。但是在Maya中运行时,状态更新却被发送到了Maya的总状态栏(如果你在其他窗口里,这一点就不太明显了),而且Maya似乎完全抢走了我的事件:我监控我事件处理方法接收到的事件,发现它从来没有收到过QEvent.StatusTip事件。我尝试把我的QDialog换成QMainWindow,但似乎没有什么变化。

有没有什么建议可以让我找到解决这个问题的方向?

3 个回答

0

对于QWidgets,colts在这里的回答挺不错的。

这是我让QActions正常工作的方式:

class ActionFn(object):
    def __init__(self, action):
        self.action = action
    def __call__(self):
        self.action.parent()._displayStatusTip(self.action.statusTip())

然后在创建动作之后:

newAction._statusFn = _StatusTipActionFn(newAction)
newAction.hovered.connect(newAction._statusFn)

希望这对你有帮助。

0

我也需要解决这个问题,所以你的帖子对我很有帮助。

以前遇到类似的事件问题时,我是通过在所有的控件上使用 installEventFilter(同样的过滤器)来解决的,而不是去创建子类。这样你就可以接收和处理这些事件,决定是阻止它们在 Maya 中发生,还是让它们通过,比如说让空格键可以用来打开你的菜单等等。

下面是我用来让 Maya 能够使用空格键(打开菜单)、ctrl+A(切换属性编辑器)和 ctrl+Z(撤销)的代码。这段代码需要加到你的事件过滤器里:

if event.type() == QEvent.KeyPress:
    key = event.key()
    mod = event.modifiers()
    if ((ctrla and key == Qt.Key_A and mod == Qt.ControlModifier) or # CTRL+A
        (ctrlz and key == Qt.Key_Z and mod == Qt.ControlModifier) or # CTRL+Z
        (space and key == Qt.Key_Space)):                            # Space Bar
        event.ignore()
        return True

return False

你只需要做相反的操作,使用 event.accept()return False

0

目前,我正在用一种很糟糕的方法来解决这个问题:我为每一个想用的控件创建一个子类,并添加一个信号来发送给父级,使用 self.setMouseTracking(True),还有一个 mouseMoveEvent(self, e) 方法来把信号发送给父级。然后在树的顶端设置状态栏。这种代码让我感觉很不舒服,因为我需要为所有控件类型都创建子类,但似乎确实有效。非常感谢任何更好的建议!

撰写回答