Python 如何检测pyqt中的密钥释放

Python 如何检测pyqt中的密钥释放,python,python-3.x,pyqt,pyqt5,qkeyevent,Python,Python 3.x,Pyqt,Pyqt5,Qkeyevent,我想创建一个PyQt5窗口(Windows操作系统),它可以识别按住CTRL键的按钮单击。我成功地创建了一个可以识别CTRL键按下的处理程序,但它找不到我需要调用和取消按钮单击事件的按钮的按下和释放。我做了很多搜索,但是PyQt5的资源似乎很低。感谢您的帮助:) 我建议您不要修改Qt设计器生成的代码,而是创建一个继承适当小部件的类,并像我建议的PyQt那样将该类用作接口。要解决此问题,您必须使用keyReleaseEvent方法在释放密钥时进行侦听: import time from PyQt5

我想创建一个PyQt5窗口(Windows操作系统),它可以识别按住CTRL键的按钮单击。我成功地创建了一个可以识别CTRL键按下的处理程序,但它找不到我需要调用和取消按钮单击事件的按钮的按下和释放。我做了很多搜索,但是PyQt5的资源似乎很低。感谢您的帮助:)


我建议您不要修改Qt设计器生成的代码,而是创建一个继承适当小部件的类,并像我建议的PyQt那样将该类用作接口。要解决此问题,您必须使用keyReleaseEvent方法在释放密钥时进行侦听:

import time
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(392, 255)
        self.unlockButton = QtWidgets.QPushButton(Dialog)
        self.unlockButton.setGeometry(QtCore.QRect(10, 180, 171, 51))
        self.unlockButton.setObjectName("unlockButton")
        self.lockButton = QtWidgets.QPushButton(Dialog)
        self.lockButton.setGeometry(QtCore.QRect(220, 180, 151, 51))
        self.lockButton.setObjectName("lockButton")
        self.label = QtWidgets.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(30, 30, 331, 71))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.lineEdit = QtWidgets.QLineEdit(Dialog)
        self.lineEdit.setGeometry(QtCore.QRect(30, 120, 261, 31))
        font = QtGui.QFont()
        font.setPointSize(18)
        self.lineEdit.setFont(font)
        self.lineEdit.setObjectName("lineEdit")

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.unlockButton.setText(_translate("Dialog", "OK"))
        self.lockButton.setText(_translate("Dialog", "Lock"))
        self.label.setText(_translate("Dialog", ""))
        self.lineEdit.setText(_translate("Dialog", ""))

class Dialog(QtWidgets.QDialog, Ui_Dialog):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        self.setupUi(self)
        self.is_key_ctrl_pressed = False
        self.unlockButton.clicked.connect(self.unlock)

    @QtCore.pyqtSlot()
    def unlock(self):
        if self.is_key_ctrl_pressed:
            print("unlock")

    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Control:
            self.is_key_ctrl_pressed = True
        super(Dialog, self).keyPressEvent(event)

    def keyReleaseEvent(self, event):
        if event.key() == QtCore.Qt.Key_Control:
            self.is_key_ctrl_pressed = False
        super(Dialog, self).keyReleaseEvent(event)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Dialog()
    w.show()
    sys.exit(app.exec_())

我建议您不要修改Qt设计器生成的代码,而是创建一个继承适当小部件的类,并像我建议的PyQt那样将该类用作接口。要解决此问题,您必须使用keyReleaseEvent方法在释放密钥时进行侦听:

import time
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(392, 255)
        self.unlockButton = QtWidgets.QPushButton(Dialog)
        self.unlockButton.setGeometry(QtCore.QRect(10, 180, 171, 51))
        self.unlockButton.setObjectName("unlockButton")
        self.lockButton = QtWidgets.QPushButton(Dialog)
        self.lockButton.setGeometry(QtCore.QRect(220, 180, 151, 51))
        self.lockButton.setObjectName("lockButton")
        self.label = QtWidgets.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(30, 30, 331, 71))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.lineEdit = QtWidgets.QLineEdit(Dialog)
        self.lineEdit.setGeometry(QtCore.QRect(30, 120, 261, 31))
        font = QtGui.QFont()
        font.setPointSize(18)
        self.lineEdit.setFont(font)
        self.lineEdit.setObjectName("lineEdit")

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.unlockButton.setText(_translate("Dialog", "OK"))
        self.lockButton.setText(_translate("Dialog", "Lock"))
        self.label.setText(_translate("Dialog", ""))
        self.lineEdit.setText(_translate("Dialog", ""))

class Dialog(QtWidgets.QDialog, Ui_Dialog):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        self.setupUi(self)
        self.is_key_ctrl_pressed = False
        self.unlockButton.clicked.connect(self.unlock)

    @QtCore.pyqtSlot()
    def unlock(self):
        if self.is_key_ctrl_pressed:
            print("unlock")

    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Control:
            self.is_key_ctrl_pressed = True
        super(Dialog, self).keyPressEvent(event)

    def keyReleaseEvent(self, event):
        if event.key() == QtCore.Qt.Key_Control:
            self.is_key_ctrl_pressed = False
        super(Dialog, self).keyReleaseEvent(event)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Dialog()
    w.show()
    sys.exit(app.exec_())

有些反馈是这样的:@eyllansc创建了一个类,该类继承了适当的小部件,并将该类用作接口。你能给我举一个例子,说明如何从继承主UI的另一个py文件打开gui.py以控制用户操作吗?嗯,我不明白你的意思,我的解决方案对你有用吗?如果你有其他问题,那么创建另一个帖子:-)如何用正确的语法从另一个py文件继承gui类。你能给我举个例子吗?我需要把def init放在那个类中吗?一些反馈???@eyllanesc创建一个继承适当小部件的类,并将该类用作接口。你能给我举一个例子,说明如何从继承主UI的另一个py文件打开gui.py以控制用户操作吗?嗯,我不明白你的意思,我的解决方案对你有用吗?如果你有其他问题,那么创建另一个帖子:-)如何用正确的语法从另一个py文件继承gui类。你能给我举个例子吗?我需要把definit放在那个类中吗?