PyQt双用途ENTER按键

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PyQt双用途ENTER按键相关的知识,希望对你有一定的参考价值。

我正在使用PyQt5和Python 3.6。我想使用ENTER(或RETURN)密钥用于双重目的。

如果用户在组合框中输入文本然后点击ENTER键,那么我希望组合框中的文本被附加到列表中。在所有其他情况下,我希望ENTER键作为按钮的快捷方式。

ENTER被按下时,我无法找到关于手柄如何的正确决定。这是一个代码示例。我正在寻找returnDecision(self)函数的决定(在脚本的底部)。

import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication, QShortcut
from PyQt5.QtWidgets import QComboBox
from PyQt5.QtGui import QKeySequence   
from PyQt5.QtCore import Qt, QSize

class Example(QWidget):

    def __init__(self):
        super().__init__()        
        self.initUI()        

    def initUI(self):
        self.setGeometry(300, 300, 300, 200)        
        btn = QPushButton('Button', self)
        btn.move(100, 50)               
        btn.clicked.connect(self.btnPrint)
        self.comboBox = QComboBox(self)
        self.comboBox.setEditable(True)
        self.comboBox.move(100, 150)
        self.comboBox.setMinimumSize(QSize(150, 0))
        self.comboBox.setEditText("Initial Text")
        self.comboBox.editTextChanged.connect(self.cboxPrint)
        enter = QShortcut(QKeySequence(Qt.Key_Return), self)
        enter.activated.connect(self.returnDecision)
        self.textList = []
        self.show()

    def btnPrint(self):
        print("Button was pressed")

    def btnAction(self):
        print("RETURN pressed when NOT editing combo box")
        self.btnPrint()

    def cboxPrint(self):
        print(self.comboBox.currentText())

    def cboxAction(self):
        print("RETURN pressed when editing combo box")
        self.textList.append(self.comboBox.currentText())
        print(self.textList)        

    def returnDecision(self):
        if ENTER KEY WAS PRESSED WHILE EDITING COMBO BOX:
            self.cboxAction()
        else:
            self.btnAction()

if __name__ == '__main__':    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

有什么建议?

答案

解决此问题的一种方法是使用QComboBox的自定义子类并覆盖keyPressEvent方法。然后还在窗口小部件中实现keyPressEvent并以不同方式处理每个事件。

class CustomCombo(QtWidgets.QComboBox):

    enter_pressed = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super().__init__(parent)

    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Return:
            self.enter_pressed.emit()
        else:
            QtWidgets.QComboBox.keyPressEvent(self, event)  
            # if the key is not return, handle normally


class Example(QWidget):

    def __init__(self):
        # Code here
        self.combo_box = CustomCombo(self)
        self.combo_box.enter_pressed.connect(self.cboxAction)

    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Return:
            self.btnAction()

以上是关于PyQt双用途ENTER按键的主要内容,如果未能解决你的问题,请参考以下文章

学习 PyQt5。在我的代码片段中找不到错误 [关闭]

PYQT5(二十四)文本框回应回车事件

如何保存编辑的 PyQt5 TableWidget 单元格?

vue监听enter回车按键并解决其他输入框触发

为啥 PyQt 中的 keyPress 事件对 Enter 键不起作用?

如何通过在 PyQt5 中按 Enter 键从 QTableView 获取数据