0

我有一个 PyQt4 QDialog,我从 Autodesk Maya 中的 python 启动。我想在窗口中有一个状态栏,或者,如果需要的话,工具提示。玛雅似乎也不赞成。我已经使用这里描述的方法实现了它:

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

如果我独立启动我的应用程序,两者都可以正常工作。但是,从 Maya 运行时,状态更新会发送到一般的 Maya 状态栏(如果您在不同的窗口中,这不是很明显),而且 Maya 似乎完全从我那里窃取了事件:如果我监视事件我的 event() 方法正在获取,它永远不会获取 QEvent.StatusTip 事件。我尝试将我的 QDialog 换成 QMainWindow,但它似乎并没有改变任何东西。

有什么建议可以向下看以使其正常工作吗?

4

3 回答 3

0

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

当我之前遇到这样的事件问题时,我通过在所有小部件(相同的过滤器)上使用 installEventFilter 来解决它,而不是子类化。然后您可以接收并接受事件以阻止它们从 Maya(或让它们通过,例如用于在您的 gui 上标记菜单的空格键等)

这是我用来让 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

于 2012-09-13T00:54:17.363 回答
0

目前,我正在以一种可怕的方式解决这个问题:对我想要使用的每个小部件进行子类化,并添加一个发送到父级的信号self.setMouseTracking(True),以及一个mouseMoveEvent(self, e)将信号发送到父级的信号。然后在树的顶部设置状态栏。这是让我觉得很脏的那种讨厌的代码,子类化了所有的小部件类型,但它似乎确实有效。非常感谢收到任何更好的建议!

于 2011-08-04T08:35:10.027 回答
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)

我希望这有帮助。

于 2016-08-23T18:52:23.767 回答