EventFilter 中的问题,使用来自 QLineEdit 的 Alt /Shift 修饰符

Problem in EventFilter, with Alt /Shift modifiers from QLineEdit

在 QLineEdit 中,如果我按:

  1. Ctrl + S, 效果很好

  2. 但同时,如果我按 Alt + C,或 Shift +S(根据我的代码)

事件过滤器工作正常,但同时 QLineEdit 框更新了那个按键。

例如,如果我从 QLineEdit 中按 Alt+C,我的字母 "C" updated/appeared QLineEdit 然后按Shift+S,在QLineEdit中,字母"S"是updated/appeared.

如何避免?

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class textbox_keypress(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("List Box Example")
        self.mydesign()
    # ----------------------------------------------------------------------------------
    def mydesign(self):
        self.textbox = QLineEdit(self)
        self.textbox.setGeometry(10,10,300,30)
        self.textbox.installEventFilter(self)


    def eventFilter(self, source, event):
        if event.type() == QEvent.KeyPress and source is self.textbox:
            if event.modifiers() == Qt.ControlModifier and event.key() == Qt.Key_S:
                print("Control + S")
            if event.key() == Qt.Key_C and event.modifiers() == Qt.AltModifier:
                print("Alt + C")
            if event.key() == Qt.Key_E and event.modifiers() == Qt.ShiftModifier:
                print("Shift + E ")
        return super(textbox_keypress, self).eventFilter(source,event)

    # ----------------------------------------------------------------------------------
def main():
    myapp = QApplication(sys.argv)
    mywindow = textbox_keypress()
    mywindow.show()
    sys.exit(myapp.exec_())
if __name__ =="__main__":
    main()

如果你想让文本不出现在QLineEdit中,那么你必须让事件不发送到QLineEdit,在事件过滤器的情况下,只需return True,例如:

# ...
if event.key() == Qt.Key_C and event.modifiers() == Qt.AltModifier:
    print("Alt + C")
    <b>return True</b>
# ...