Python PyQt4-如何禁用所有热键(本机键盘快捷键)

Python PyQt4-如何禁用所有热键(本机键盘快捷键),python,pyqt4,hotkeys,Python,Pyqt4,Hotkeys,我有一个PyQt4 GUI,它包含了许多库(比如Mayavi),这些库都有自己的内部键盘快捷键(已经存在了,没有输入任何代码来设置它们)。一个这样的键是Mayavi中的s——如果您在将鼠标悬停在Mayavi图形上时按下此按钮,将出现一个保存窗口。更糟糕的是,当鼠标悬停在上方时按下字母p将完全冻结该窗口上的所有摄像头控件 我在四月份发表了一篇类似的文章,内容是关于如何在其中一个嵌入式库(Mayavi)中关闭这些快捷方式——然而,5个月后,这些知识似乎非常难以捉摸 在此问题上的任何帮助都将不胜感激

我有一个PyQt4 GUI,它包含了许多库(比如Mayavi),这些库都有自己的内部键盘快捷键(已经存在了,没有输入任何代码来设置它们)。一个这样的键是Mayavi中的
s
——如果您在将鼠标悬停在Mayavi图形上时按下此按钮,将出现一个保存窗口。更糟糕的是,当鼠标悬停在上方时按下字母
p
将完全冻结该窗口上的所有摄像头控件

我在四月份发表了一篇类似的文章,内容是关于如何在其中一个嵌入式库(Mayavi)中关闭这些快捷方式——然而,5个月后,这些知识似乎非常难以捉摸

在此问题上的任何帮助都将不胜感激


更新: 我根据论坛反馈编辑了原始帖子-非常抱歉混淆了这个问题;希望下面的代码会更清楚:

import sys, os
from pyface.qt import QtGui, QtCore
os.environ['ETS_TOOLKIT'] = 'qt4'
from traits.api import HasTraits,Instance,on_trait_change,Int
from traitsui.api import View,Item,VGroup
from mayavi import mlab
from mayavi.core.ui.api import MayaviScene, MlabSceneModel, SceneEditor

class Mayavi_Scene(HasTraits):
    scene = Instance(MlabSceneModel, ())

    @on_trait_change('scene.activated')
    def update_scene(self):
        Mayavi_Scene.fig1 = mlab.figure(1, bgcolor=(.5,.5,.5))
        self.scene.mlab.clf(figure=Mayavi_Scene.fig1)
        testPlot = mlab.test_contour3d()

    view = View(Item('scene', editor = SceneEditor(scene_class=MayaviScene),
                    height=300, width=300, show_label=False),
                resizable=True,
                )

class P1(QtGui.QWidget):    
    def __init__(self, parent=None):
        super(P1, self).__init__(parent)
        layout = QtGui.QGridLayout(self)

        self.label_avgVol = QtGui.QLabel('PyQt window without Mayavi')
        self.label_avgVol.setMargin(5)
        self.label_avgVol.setFrameStyle(QtGui.QFrame.Box | QtGui.QFrame.Sunken)
        self.label_avgVol.setAlignment(QtCore.Qt.AlignCenter | QtCore.Qt.AlignVCenter)
        layout.addWidget(self.label_avgVol, 0, 0, 1, 3)
        self.label_avgVol.show()

class P2(QtGui.QWidget):    
    def __init__(self, parent=None):
        super(P2, self).__init__(parent)
        layout = QtGui.QGridLayout(self)

        self.label_edge1 = QtGui.QLabel('')
        self.label_edge1.setMargin(5)
        self.label_edge1.setFrameStyle(QtGui.QFrame.Panel | QtGui.QFrame.Sunken)
        layout.addWidget(self.label_edge1, 0, 0, 4, 3)
        self.label_edge1.show()

        self.label_avgVol = QtGui.QLabel('PyQt window with Mayavi')
        self.label_avgVol.setMargin(5)
        self.label_avgVol.setFrameStyle(QtGui.QFrame.Box | QtGui.QFrame.Sunken)
        self.label_avgVol.setAlignment(QtCore.Qt.AlignCenter | QtCore.Qt.AlignVCenter)
        layout.addWidget(self.label_avgVol, 0, 0, 1, 3)
        self.label_avgVol.show()

        self.viz1 = Mayavi_Scene()
        self.ui1 = self.viz1.edit_traits(parent=self, kind='subpanel').control
        layout.addWidget(self.ui1, 1, 1, 1, 1)

        self.button = QtGui.QPushButton("Test", self)
        layout.addWidget(self.button, 2, 1, 1, 1)
        self.button.show()


class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        tab1 = P1(self)
        tab2 = P2(self)
        global tabs
        tabs = QtGui.QTabWidget(self)
        tabs.addTab(tab1, 'eventFilter works')
        tabs.addTab(tab2, 'eventFilter ignored')
        self.setCentralWidget(tabs)
        self.show()

        self.installEventFilter(self)

    def eventFilter(self, source, event):
        if event.type() == QtCore.QEvent.KeyPress:
            print('KeyPress: %s [%r]' % (event.key(), source))
            return True
            #event.ignore()

        return super(MainWindow, self).eventFilter(source, event)

if __name__ == '__main__':
    app = QtGui.QApplication.instance()
    w = MainWindow()
    sys.exit(app.exec_())

解决方案:感谢评论中非常有用的个人,上述代码(在原始帖子中)按预期(或尽可能)工作。显然,没有办法通过PyQt事件过滤器控制PyQt(如Mayavi)中模块上的事件。但是,如果有人正在寻找单独控制PyQt事件的正确布局,这里已经提供了该布局。

您指的是什么快捷方式?首先要做的是在应用程序对象上,检查相关事件是否可以被拦截。@eyllanesc我不确定快捷方式实际上是什么,但如果我一个接一个地按键盘上的每个键,就会出现奇怪的故障。例如,当鼠标悬停在Mayavi场景(在mac OS上)上时,“p”按钮会完全冻结所有相机控件,直到程序重新启动。@ees将
event.ignore()
更改为
return True
。此方法仅适用于Qt小部件,如果焦点在其他小部件上,则Qt无法处理它。