防止在QScintilla中触发键盘快捷键(示例代码)
问题描述:
我想阻止在我的QScintilla小部件中编辑代码时触发应用程序键盘快捷键,就像正常的QLineEdit字段没有。防止在QScintilla中触发键盘快捷键(示例代码)
在下面的可执行示例代码中,不能在QScintilla小部件中输入空格,因为空格已被设置为快捷方式,但在QLineEdit中它可以正常工作。
我不知道是否它可能与QScintilla没有正确地抓住键盘输入有关(尽管显然确实如此,因为可以在其中输入字符)。
import sys,os
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4 import Qsci
class MyWidget(QWidget):
def __init__(self):
QWidget.__init__(self)
self.butt = QPushButton("button!!")
self.act = QAction("new act",self)
self.act.setShortcut(QKeySequence(Qt.Key_Space))
self.act.triggered.connect(tjosan)
self.butt.clicked.connect(self.act.trigger)
self.sci = Qsci.QsciScintilla()
vbox = QVBoxLayout()
vbox.addWidget(self.sci)
vbox.addWidget(QLineEdit())
vbox.addWidget(self.butt)
self.setLayout(vbox)
self.addAction(self.act)
def tjosan():
print "action !!!"
if __name__ == "__main__":
app = QApplication(sys.argv)
widg = MyWidget()
widg.show()
sys.exit(app.exec_())
答
您需要筛选ShortcutOverride事件以获得与QLineEdit相同的行为。下面是您的示例的编辑版本,演示了如何实现该功能的方法:
import sys,os
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4 import Qsci
class MyWidget(QWidget):
def __init__(self):
QWidget.__init__(self)
self.butt = QPushButton("button!!")
self.act = QAction("new act",self)
self.act.setShortcut(QKeySequence(Qt.Key_Space))
self.act.triggered.connect(tjosan)
self.butt.clicked.connect(self.act.trigger)
self.sci = Qsci.QsciScintilla()
self.sci.installEventFilter(self)
vbox = QVBoxLayout()
vbox.addWidget(self.sci)
vbox.addWidget(QLineEdit())
vbox.addWidget(self.butt)
self.setLayout(vbox)
self.addAction(self.act)
def eventFilter(self, widget, event):
if (event.type() == QEvent.ShortcutOverride and
widget is self.sci):
print 'ShortcutOverride'
event.accept()
return True
return QWidget.eventFilter(self, widget, event)
def tjosan():
print "action !!!"
if __name__ == "__main__":
app = QApplication(sys.argv)
widg = MyWidget()
widg.show()
sys.exit(app.exec_())
这很好用!非常感谢。 我的hackish临时解决方案是禁用focusInEvent()中的快捷方式,该快捷方式虽然有效,但有异味。 – rickgn