【问题标题】:Detecting Key Sequences检测键序列
【发布时间】:2013-03-26 17:12:00
【问题描述】:

我正在使用 pyqt 的 Qshortcut 来尝试检测组合键以触发某些操作,即何时 用户在 QtextEdit 小部件中键入 ->,我想打印“更改模式”。 我见过其他涉及 CTRL+E 或其他一些 CTRL 或 shift 键的键序列示例 组合,

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

但我真的很想捕获 ->(连字符后跟大于号)。有关如何执行此操作的任何建议

【问题讨论】:

标签: python qt python-2.7 pyqt qtextedit


【解决方案1】:

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_())

【讨论】:

    【解决方案2】:

    只要捕捉到信号QTextEdit::textChanged(),然后每个用户进行更改,扫描文本以查找“->”。授予每次扫描整个文本块的蛮力方法并不漂亮;另一种选择是仅扫描文本的最后两个字符。但是,这忽略了用户通过删除“-”和“>”字符之间的文本来创建“->”的情况。如果您不担心这种情况,那么就选择最后两个。 QTextEdit::cursorPositionChanged 可能允许您在插入/删除点进行精确测试。

    【讨论】:

      猜你喜欢
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多