Обнаружение ключевых последовательностей

Я использую 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)

Но я действительно хочу перехватить ->(дефис, за которым следует знак "больше"). Любые предложения о том, как это сделать


person user595985    schedule 26.03.2013    source источник
comment
Вас может заинтересовать этот пост, в котором обсуждается, как обрабатывать несколько нажатых клавиш: stackoverflow.com/questions/7176951/   -  person Paul    schedule 28.03.2013


Ответы (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_())
person Community    schedule 27.03.2013

Просто ловите сигнал QTextEdit::textChanged(), и каждый раз, когда пользователь вносит изменения, сканируйте текст на наличие '->'. Грантер, грубый подход к сканированию всего текстового блока каждый раз не очень хорош; другой вариант — сканирование только двух последних символов текста. Однако это упускает случай, когда пользователь создает «->», удаляя текст между символами «-» и «>». Если вас не беспокоит этот случай, то просто используйте последние два. QTextEdit::cursorPositionChanged может позволить вам проверить именно в точке вставки/удаления.

person Matt Phillips    schedule 27.03.2013