Как мне получить текст QLineEdit в метод?

#python #pyqt #pyqt5

#python #pyqt #pyqt5

Вопрос:

Я все еще не могу понять, как правильно подключить Qt_pushButton или Qt_LineEdit к методам. Я был бы так рад получить объяснение, которое даже я действительно понимаю…

Я собрал довольно простой пользовательский интерфейс с помощью Qt Designer. Он содержит lineEdit с именем «lineEditTest», который я действительно могу изменить, введя

 self.lineEditTest.setText("changed Text")
 

Тем не менее, я полностью застрял с получением текста, который пользователь ввел обратно в мою программу. Я хотел бы автоматически отправлять введенный текст в мою функцию, которая устанавливает значение var в это значение и возвращает его в мой класс пользовательского интерфейса. Qlineedit’s signal editingFinished звучит идеально для этого, я полагаю? Но он не будет передавать текст, который пользователь ввел в мою функцию.

У QLineEdit есть свойство под названием «текст», верно? Поэтому мне кажется логичным, что я просто должен передать другой аргумент — помимо self — в мою функцию с именем text .

Мой код действительно выглядит так, но он, очевидно, вообще не будет работать:

 from PyQt5 import QtWidgets, uic
import sys


class Ui(QtWidgets.QMainWindow):
    def __init__(self):
        super(Ui, self).__init__()
        uic.loadUi('test.ui', self)

        self.lineEditTest.setText("test")
        self.lineEditTest.editingFinished.connect(self.changeText(text))
        self.show()

    def changeText(self):
        currentText = text
        print (currentText)
        return currentText

app = QtWidgets.QApplication(sys.argv)
window = Ui()
app.exec_()
 

Это просто приведет к сбою с:

 NameError: name 'text' is not defined`
 

Ответ №1:

Проблема, похоже, в том, что OP не понимает логику сигналов и слотов (я рекомендую вам проверить здесь). Сигналы — это объекты, которые передают информацию, а слоты — это функции (обычно вызываемые), которые подключены к сигналам для получения этой информации. И информация, передаваемая сигналом, зависит от каждого случая, например, если вы проверяете документы editingFinished signal:

void QLineEdit::editingFinished()
Этот сигнал выдается, когда нажата клавиша возврата или ввода или редактирование строки теряет фокус. Обратите внимание, что если в строке edit установлен validator() или InputMask() и нажата клавиша enter / return, сигнал editingFinished() будет выдаваться только в том случае, если ввод следует за InputMask(), а validator() возвращает QValidator::Acceptable .

Этот сигнал не отправляет никакой информации, поэтому не ожидайте получения какой-либо информации, кроме информации о том, что издание завершено пользователем. Итак, как я могу получить текст? Ну, с помощью text() метода QLineEdit:

 class Ui(QtWidgets.QMainWindow):
    def __init__(self):
        super(Ui, self).__init__()
        uic.loadUi("test.ui", self)

        self.lineEditTest.setText("test")
        self.lineEditTest.editingFinished.connect(self.changeText)
        self.show()

    def changeText(self):
        text = self.lineEditTest.text()
        print(text)
 

И как это сделать, если сигнал посылает информацию? Затем слот (функция), к которому это подключено, будет иметь в качестве аргументов эту информацию, например, если вы используете textChanged сигнал, который выдается каждый раз при изменении текста QLineEdit, он должен быть следующим:

 class Ui(QtWidgets.QMainWindow):
    def __init__(self):
        super(Ui, self).__init__()
        uic.loadUi("test.ui", self)

        self.lineEditTest.setText("test")
        self.lineEditTest.textChanged.connect(self.changeText)
        self.show()

    def changeText(self, text):
        print(text)
        # or
        # text = self.lineEditTest.text()
        # print(text)
 

Ответ №2:

То, как вы привязываете свой обратный вызов, неверно. Когда вы привязываете обратный вызов (и это верно для других фреймворков, а не только для привязки обратных вызовов в PyQt), вы хотите привязать функцию, которая должна запускаться при возникновении определенного события. Это не то, что вы делаете — вы явно вызываете обратный self.changeText(text) вызов (примечание: круглые скобки вызывают функцию). Итак, вы вызываете (вызываете) функцию, оцениваете ее и вводите возвращаемое значение ...editingFinished.connect() .

Не вызывайте функцию явно. Просто передайте имя функции. Это имеет смысл, если вы подумаете об этом: мы передаем вызываемый объект connect — это функция, которая должна быть вызвана в более поздний момент времени, когда editingFinished произойдет событие.

Вам также не нужно передавать lineEditTest текст в обратный вызов, так как вы можете просто получить любой текст в виджете self.lineEditTest.text() изнутри обратного вызова.

 from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QMainWindow


class MainWindow(QMainWindow):

    def __init__(self):

        from PyQt5 import uic

        super(MainWindow, self).__init__()

        uic.loadUi("mainwindow.ui", self)

        self.lineEditTest.setPlaceholderText("Type something...")
        self.lineEditTest.editingFinished.connect(self.on_line_edit_finished_editing)

    @pyqtSlot()
    def on_line_edit_finished_editing(self):
        text = self.lineEditTest.text()
        print(f"You finished editing, and you entered {text}")


def main():
    from PyQt5.QtWidgets import QApplication

    application = QApplication([])
    window = MainWindow()

    window.show()

    return application.exec()


if __name__ == "__main__":
    import sys
    sys.exit(main())