#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())