Обнаружение ключевых последовательностей
Я использую Qshortcut pyqt, пытаясь обнаружить комбинацию клавиш для запуска какого-либо действия, т.е. когда пользователь вводит -> в виджет QtextEdit, я хотел бы напечатать "режим изменения". Я видел другие примеры последовательности клавиш, которые включают CTRL+E или некоторую другую комбинацию клавиш CTRL или Shift,
self.shcut1 = QtGui.QShortcut(self)
self.shcut1.setKey("CTRL+E")
self.connect(self.shcut1, QtCore.SIGNAL("activated()"), self.close)
Но я действительно хочу поймать в ловушку ->(дефис с последующим знаком "больше"). Любые предложения о том, как это сделать
2 ответа
QShortCut
принимает только комбинации QtCore.Qt:: KeyboardModifiers. Попробуйте использовать фильтр событий:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from PyQt4 import QtGui, QtCore
class MyWindow(QtGui.QTextEdit):
modeChanged = QtCore.pyqtSignal(bool)
_seenMinus = False
def __init__(self, parent=None):
super(MyWindow, self).__init__(parent)
self.installEventFilter(self)
self.modeChanged.connect(self.on_modeChanged)
def on_modeChanged(self):
print "Changing Mode."
def eventFilter(self, obj, event):
if event.type() == QtCore.QEvent.KeyPress:
if event.key() == QtCore.Qt.Key_Minus:
self._seenMinus = True
elif event.key() == QtCore.Qt.Key_Greater \
and event.modifiers() == QtCore.Qt.ShiftModifier \
and self._seenMinus:
self.modeChanged.emit(True)
self.setStyleSheet("""
background-color: lightgray;
""")
elif event.modifiers() != QtCore.Qt.ShiftModifier:
if self._seenMinus == True:
self.modeChanged.emit(False)
self._seenMinus = False
self.setStyleSheet("")
return super(MyWindow, self).eventFilter(obj, event)
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
app.setApplicationName('MyWindow')
main = MyWindow()
main.show()
sys.exit(app.exec_())
Просто поймать сигнал QTextEdit::textChanged()
и каждый пользователь вносит изменения, сканирует текст на предмет "->". Более грубый подход сканирования всего текстового блока каждый раз не очень хорош; Другой вариант - сканирование только двух последних символов текста. Однако это не касается случая, когда пользователь создает "->", удаляя текст между символами "-" и ">". Если вы не беспокоитесь об этом случае, то просто перейдите к последним двум. QTextEdit::cursorPositionChanged
может позволить вам тестировать точно в точке вставки / удаления.