Python 2.7 在pyqt中,如何打印;Ctrl+;“关键”;在QLineEdit中,按Ctrl+;任意键

Python 2.7 在pyqt中,如何打印;Ctrl+;“关键”;在QLineEdit中,按Ctrl+;任意键,python-2.7,pyqt4,Python 2.7,Pyqt4,这里是我的kode,我为QLineEdit生成了一个事件,将按下的组合键放入文本行中,Shift键和Alt键可以,但Ctrl键不行。为什么 #!/usr/bin/python import sys from PyQt4.QtCore import * from PyQt4.QtGui import * def main(): app = QApplication(sys.argv) w = MyWindow() w.show() sys.exit(app.ex

这里是我的kode,我为QLineEdit生成了一个事件,将按下的组合键放入文本行中,Shift键和Alt键可以,但Ctrl键不行。为什么

#!/usr/bin/python

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

def main():
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    sys.exit(app.exec_())
class MyWindow(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)

        self.la = QLabel("Press tab in this box:")
        self.le = MyLineEdit()


        layout = QVBoxLayout()
        layout.addWidget(self.la)
        layout.addWidget(self.le)
        self.setLayout(layout)


        self.connect(self.le, SIGNAL("press"),
                 self.update)

    def update(self):
        oldText = str(self.le.text())
        self.le.setText(self.le.myText)

class MyLineEdit(QLineEdit):
    def __init__(self, *args):
        QLineEdit.__init__(self, *args)

        self.myText = ""
    def event(self, event):
        if event.type() == QEvent.KeyPress:
            if  event.modifiers() & Qt.ControlModifier  :
                print event.text()
                self.myText = "Ctrl+"+ event.text()
                self.emit(SIGNAL("press"))
            return True
        return QLineEdit.event(self, event)

if __name__ == "__main__":
    main()
在文本行中,我可以通过变量self.myText值在文本行中输入Shift键和Alt键,但不能在Ctrl键中输入。为什么

#!/usr/bin/python

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

def main():
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    sys.exit(app.exec_())
class MyWindow(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)

        self.la = QLabel("Press tab in this box:")
        self.le = MyLineEdit()


        layout = QVBoxLayout()
        layout.addWidget(self.la)
        layout.addWidget(self.le)
        self.setLayout(layout)


        self.connect(self.le, SIGNAL("press"),
                 self.update)

    def update(self):
        oldText = str(self.le.text())
        self.le.setText(self.le.myText)

class MyLineEdit(QLineEdit):
    def __init__(self, *args):
        QLineEdit.__init__(self, *args)

        self.myText = ""
    def event(self, event):
        if event.type() == QEvent.KeyPress:
            if  event.modifiers() & Qt.ControlModifier  :
                print event.text()
                self.myText = "Ctrl+"+ event.text()
                self.emit(SIGNAL("press"))
            return True
        return QLineEdit.event(self, event)

if __name__ == "__main__":
    main()

当我们使用key()方法返回键的int值时,我们可以使用unichr()函数将int转换为char


原始示例不起作用的原因是,许多Ctrl+组合键会生成控制字符,例如Ctrl+J会生成换行符

捕获键盘组合的正确方法是使用,它适用于所有键,包括功能键、箭头键、页面上/下键等。您还可以使用来获取转换后的快捷键

以下是基于原始示例的演示:

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

def main():
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    sys.exit(app.exec_())

class MyWindow(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)

        self.la = QLabel("Press tab in this box:")
        self.le = MyLineEdit()

        layout = QVBoxLayout()
        layout.addWidget(self.la)
        layout.addWidget(self.le)
        self.setLayout(layout)

        self.le.keyPressed.connect(self.update)

    def update(self, text):
        self.le.setText(text)

MOD_MASK = (Qt.CTRL | Qt.ALT | Qt.SHIFT | Qt.META)

class MyLineEdit(QLineEdit):
    keyPressed = pyqtSignal(str)

    def keyPressEvent(self, event):
        keyname = ''
        key = event.key()
        modifiers = int(event.modifiers())
        if (modifiers and modifiers & MOD_MASK == modifiers and
            key > 0 and key != Qt.Key_Shift and key != Qt.Key_Alt and
            key != Qt.Key_Control and key != Qt.Key_Meta):

            keyname = QKeySequence(modifiers + key).toString()

            print('event.text(): %r' % event.text())
            print('event.key(): %d, %#x, %s' % (key, key, keyname))

        self.keyPressed.emit(keyname)

if __name__ == "__main__":
    main()

非常感谢您的回答,以及如何能够捕获Ctrl+Alt+key、Ctrl+Shift+key、Alt+key、Alt+Shift+key@Tigran84. 我更新了我的答案。行编辑将只接受包含
MOD|u MASK
中修饰符的组合键。很抱歉,我从未见过这种分配MOD|u MASK=(Qt.CTRL | Qt.ALT | Qt.SHIFT | Qt.META),我可以在其中阅读this@Tigran84. 这只是一组正在或将在一起的标志(括号不起任何作用)。对不起,我的英语技能很差,我不明白这个网站是如何工作的