Предотвращение сочетаний клавиш в QScintilla (пример кода) - PullRequest
2 голосов
/ 11 октября 2011

Я бы хотел, чтобы при редактировании кода в моем виджете QScintilla не вызывались сочетания клавиш приложения, как это делает обычное поле QLineEdit.

В приведенном ниже примере кода ниже невозможно ввести пробелы в виджете 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_())

1 Ответ

3 голосов
/ 11 октября 2011

Вам необходимо отфильтровать события 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_())
...