Оптимизация получения текста из QLineEdit

Рейтинг: 1Ответов: 1Опубликовано: 22.04.2023

В общем, проблема заключается в том, что при наличии большого количества 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_())

введите сюда описание изображения