在Maya的PyQt应用中,工具提示或状态栏无法工作
我在Autodesk Maya中用Python启动了一个PyQt4的QDialog对话框。我想在这个窗口里加一个状态栏,或者如果需要的话,加一些工具提示。不过,Maya似乎不太支持这两种方式。我按照这里的方法实现了:
http://www.qtcentre.org/threads/10593-QDialog-StatusBar
如果我单独运行我的应用程序,状态栏和工具提示都能正常工作。但是在Maya中运行时,状态更新却被发送到了Maya的总状态栏(如果你在其他窗口里,这一点就不太明显了),而且Maya似乎完全抢走了我的事件:我监控我事件处理方法接收到的事件,发现它从来没有收到过QEvent.StatusTip事件。我尝试把我的QDialog换成QMainWindow,但似乎没有什么变化。
有没有什么建议可以让我找到解决这个问题的方向?
3 个回答
对于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)
希望这对你有帮助。
我也需要解决这个问题,所以你的帖子对我很有帮助。
以前遇到类似的事件问题时,我是通过在所有的控件上使用 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
。
目前,我正在用一种很糟糕的方法来解决这个问题:我为每一个想用的控件创建一个子类,并添加一个信号来发送给父级,使用 self.setMouseTracking(True)
,还有一个 mouseMoveEvent(self, e)
方法来把信号发送给父级。然后在树的顶端设置状态栏。这种代码让我感觉很不舒服,因为我需要为所有控件类型都创建子类,但似乎确实有效。非常感谢任何更好的建议!