2

pyqtのQshortcutを使用して、キーの組み合わせを検出して何らかのアクションをトリガーしようとしています。つまり、ユーザー がQtextEditウィジェットに->と入力 したときに、「変更モード」を出力したいと思います。CTRL+Eまたは他のCTRLまたはシフトキーの組み合わせを含む他のキーシーケンスの例を見てきました。

    self.shcut1 = QtGui.QShortcut(self)
    self.shcut1.setKey("CTRL+E")
    self.connect(self.shcut1, QtCore.SIGNAL("activated()"), self.close)

しかし、私は本当にトラップしたい->(ハイフンの後に大なり記号が続く)。これを行う方法に関する提案

4

2 に答える 2

1

信号をキャッチするだけQTextEdit::textChanged()で、すべてのユーザーが変更を加え、テキストをスキャンして「->」を探します。毎回テキストブロック全体をスキャンするという総当たり攻撃のアプローチはきれいではありません。別のオプションは、テキストの最後の2文字のみをスキャンすることです。ただし、これは、ユーザーが「-」と「>」文字の間のテキストを削除して「->」を作成する場合を見逃します。その場合を心配していない場合は、最後の2つを使用してください。 QTextEdit::cursorPositionChanged挿入/削除ポイントで正確にテストできる場合があります。

于 2013-03-27T06:22:32.427 に答える
1

QShortCutQtCore.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_())
于 2013-03-27T10:20:01.057 に答える