Оптимизация получения текста из QLineEdit
В общем, проблема заключается в том, что при наличии большого количества QLineEdit постоянно приходится прописывать каждый из них, например: отчистке формы, выгрузке данных в бд.
Я не нашел ничего лучше, чем просто указание каждого виджета последовательно с отчисткой их отчисткой. Мне нужно, чтобы отчистка могла осуществляться например для всех QLineEdit в окне.
Предоставляю минимально рабочий пример, в котором отчистка виджетов происходит, так как описано выше.
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QVBoxLayout, QPushButton
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# Создаем метки и поля ввода
self.label1 = QLabel('Имя:')
self.nameEdit = QLineEdit()
self.label2 = QLabel('Фамилия:')
self.surnameEdit = QLineEdit()
self.label3 = QLabel('Адрес:')
self.addressEdit = QLineEdit()
self.label4 = QLabel('Телефон:')
self.phoneEdit = QLineEdit()
self.label5 = QLabel('Email:')
self.emailEdit = QLineEdit()
# Создаем кнопку "Очистить форму"
clearButton = QPushButton('Очистить форму')
# Создаем вертикальный макет и добавляем в него метки, поля ввода и кнопку
vbox = QVBoxLayout()
vbox.addWidget(self.label1)
vbox.addWidget(self.nameEdit)
vbox.addWidget(self.label2)
vbox.addWidget(self.surnameEdit)
vbox.addWidget(self.label3)
vbox.addWidget(self.addressEdit)
vbox.addWidget(self.label4)
vbox.addWidget(self.phoneEdit)
vbox.addWidget(self.label5)
vbox.addWidget(self.emailEdit)
vbox.addWidget(clearButton)
# Подключаем обработчик нажатия на кнопку
clearButton.clicked.connect(self.clearForm)
# Устанавливаем макет для окна
self.setLayout(vbox)
# Устанавливаем заголовок окна и размеры
self.setWindowTitle('Форма ввода данных')
self.setGeometry(100, 100, 300, 300)
# Определяем метод для очистки всех полей ввода
def clearForm(self):
self.nameEdit.clear()
self.surnameEdit.clear()
self.addressEdit.clear()
self.phoneEdit.clear()
self.emailEdit.clear()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
Пожалуйста, если в вопросе чего-то не достает, или где-то есть ошибка, то не минусуйте вопрос, а напишите в комментариях и я правлю. Всем заранее спасибо :)
Ответы (1 шт):
self.findChildren(QLineEdit) - возвращает всех потомков этого объекта с заданным именем.
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, \
QLineEdit, QVBoxLayout, QPushButton, QFormLayout, QGridLayout,\
QTextBrowser
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.nameEdit = QLineEdit(objectName='le_name')
self.surnameEdit = QLineEdit(objectName='le_surname')
self.addressEdit = QLineEdit(objectName='le_address')
self.phoneEdit = QLineEdit(objectName='le_phone')
self.emailEdit = QLineEdit(objectName='le_email')
self.clearButton = QPushButton('Очистить форму')
self.clearButton.clicked.connect(self.clearForm)
self.showButton = QPushButton('Показать форму')
self.showButton.clicked.connect(self.showForm)
form_layout = QFormLayout()
form_layout.addRow('Имя:', self.nameEdit)
form_layout.addRow('Фамилия:', self.surnameEdit)
form_layout.addRow('Адрес:', self.addressEdit)
form_layout.addRow('Телефон:', self.phoneEdit)
form_layout.addRow('Email:', self.emailEdit)
self.textBrowser = QTextBrowser()
main_layout = QGridLayout(self)
main_layout.addLayout(form_layout, 0, 0, 1, 2)
main_layout.addWidget(self.textBrowser, 1, 0, 1, 2)
main_layout.addWidget(self.showButton, 2, 0)
main_layout.addWidget(self.clearButton, 2, 1)
def clearForm(self):
self.textBrowser.clear()
for lineEdit in self.findChildren(QLineEdit): # !!! +++ findChildren
lineEdit.clear()
def showForm(self):
self.textBrowser.clear()
for lineEdit in self.findChildren(QLineEdit):
self.textBrowser.append(
f'{lineEdit.objectName():15} - {lineEdit.text()}')
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.setWindowTitle('Форма ввода данных')
window.resize(300, 300)
window.show()
sys.exit(app.exec_())
