防止在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_()) 
+0

这很好用!非常感谢。 我的hackish临时解决方案是禁用focusInEvent()中的快捷方式,该快捷方式虽然有效,但有异味。 – rickgn