Как использовать события нажатия клавиш в PyQt5 - PullRequest
1 голос
/ 24 сентября 2019

Я хочу, чтобы функция «Добавить» запускалась, когда я вводил число в «LE1» и нажимал клавишу «Ввод» на клавиатуре.Я также хочу, чтобы строка редактирования очищала текст, когда я выбираю его для редактирования.

from PyQt5 import QtWidgets, QtCore
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QLineEdit, QLabel, QGridLayout, QWidget, QDialog

class MyWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MyWindow, self).__init__()
        centralWidget = QWidget()
        self.setCentralWidget(centralWidget)
        self.Glayout = QGridLayout(centralWidget)
        self.LE1 = QLineEdit('Input Number',self)
        self.LE1.keyPressEvent(self.KPE)
        Label1 = QLabel('+ 1 =',self)
        self.LE2 = QLineEdit(self)
        self.Glayout.addWidget(self.LE1)
        self.Glayout.addWidget(Label1)
        self.Glayout.addWidget(self.LE2)



    def Add(self):
        Num = float(self.LE1.text())
        math = Num + 1
        ans = str(math)
        self.LE2.setText(ans)



    def KPE(self):
        if event.key() == Qt.Key_Enter:
            self.Add()



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

1 Ответ

1 голос
/ 24 сентября 2019

keyPressEvent - это метод, который, если вы переопределяете его таким образом, вы теряете поведение по умолчанию, к тому же это не нужно, поскольку QLineEdit имеет сигнал returnPressed, который уведомляет, если нажата Enter .

С другой стороны, преобразование строки в плавающее может вызвать исключение, поэтому вы должны предотвратить этот случай, другой лучший вариант - использовать виджет, который допускает только числовые значения с QSpinBox или QDoubleSpinBox, или, по крайней мере, ограничить значения, которые вводятся вQLineEdit с соответствующим QValidator.

И, наконец, не используйте слово math в качестве имени переменной, поскольку это имя библиотеки, которая может вызвать проблемы в будущем.

Учитывая вышеизложенное, решение:

from PyQt5.QtWidgets import (
    QApplication,
    QGridLayout,
    QLineEdit,
    QLabel,
    QMainWindow,
    QWidget,
)


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

        self.LE1 = QLineEdit("Input Number")
        self.LE1.returnPressed.connect(self.add)
        Label1 = QLabel("+ 1 =")
        self.LE2 = QLineEdit()

        centralWidget = QWidget()
        self.setCentralWidget(centralWidget)

        layout = QGridLayout(centralWidget)
        layout.addWidget(self.LE1)
        layout.addWidget(Label1)
        layout.addWidget(self.LE2)

    def add(self):
        try:
            num = float(self.LE1.text())
            num += 1
            self.LE2.setText(str(num))
        except ValueError:
            pass


if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...