PyQt4 - 如何禁用所有热键(本机键盘快捷键)
PyQt4 - how to disable all hot keys (native keyboard shortcuts)
我有一个 PyQt4 GUI,其中包含许多库(例如 Mayavi),这些库本身就有自己的内部键盘快捷键(已经存在,无需输入任何代码来设置它们)。 Mayavi 中的一个这样的键是 s
- 如果您在将鼠标悬停在 Mayavi 模型上时按下此按钮,将出现一个保存 window。更糟糕的是,在悬停时按下字母 p
将完全冻结 window 上的所有相机控件。
我在 4 月份就如何在其中一个嵌入式库 (Mayavi) 中关闭这些快捷方式做了一个类似的 post - 然而,5 个月后,似乎这样的知识非常难以捉摸。
非常感谢对此问题的任何帮助。
更新:
我已经根据论坛反馈编辑了原始 post - 非常抱歉混淆了这个问题;希望下面的代码会更清楚:
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_())
解决方案:感谢评论中非常有帮助的个人,上面的代码(在原来的 post 中)按预期(或最佳)工作它可以)。显然没有办法通过 PyQt 事件过滤器来控制 PyQt(例如 Mayavi)中保存的模块上的事件。但是,如果有人正在寻找正确的布局来单独控制 PyQt 事件,这里已经提供了它。
我有一个 PyQt4 GUI,其中包含许多库(例如 Mayavi),这些库本身就有自己的内部键盘快捷键(已经存在,无需输入任何代码来设置它们)。 Mayavi 中的一个这样的键是 s
- 如果您在将鼠标悬停在 Mayavi 模型上时按下此按钮,将出现一个保存 window。更糟糕的是,在悬停时按下字母 p
将完全冻结 window 上的所有相机控件。
我在 4 月份就如何在其中一个嵌入式库 (Mayavi) 中关闭这些快捷方式做了一个类似的 post - 然而,5 个月后,似乎这样的知识非常难以捉摸。
非常感谢对此问题的任何帮助。
更新: 我已经根据论坛反馈编辑了原始 post - 非常抱歉混淆了这个问题;希望下面的代码会更清楚:
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_())
解决方案:感谢评论中非常有帮助的个人,上面的代码(在原来的 post 中)按预期(或最佳)工作它可以)。显然没有办法通过 PyQt 事件过滤器来控制 PyQt(例如 Mayavi)中保存的模块上的事件。但是,如果有人正在寻找正确的布局来单独控制 PyQt 事件,这里已经提供了它。