Как сохранить ответы PyQt5 QLineEdit в словаре в определенных местах в словаре

Aug 18 2020

Я использовал несколько строковых правок, чтобы получить информацию от пользователя. Я знаю, что могу создать сигнал с помощью textchanged (), а затем подключить его к слоту, где я могу извлечь текст, введенный пользователем для редактирования этой строки.

Но теперь предположим, что я хочу сохранить эту информацию, полученную в результате редактирования конкретной строки, в словаре. Например, пользователь отвечает self.title = QLineEdit(), это подключается к слоту, который заполняет ответ ключом "title" словаря. Если пользователь отвечает self.product= QLineEdit(), это подключается к тому же слоту, что и раньше, но теперь ответ заполняется ключом «Product» словаря. Точно так же, если позже в эти строковые правки будут внесены какие-либо изменения, словарь должен обновиться новыми ответами.

Как я могу это сделать? Я хочу избежать создания отдельных слотов для каждого QlineEdit, поскольку это может быть утомительно.

answers = {"title": "", "Date": "", "Product": "", "Serial Num": ""}
  def projectDetailsUI(self):
      layout = QGridLayout()
      self.title = QLineEdit()
      self.title.setFixedWidth(300)
      
      self.date = QLineEdit()
      self.date.setFixedWidth(120)
      
      self.product = QLineEdit()
      self.product.setFixedWidth(300)
      
      self.serialNum = QLineEdit()
      self.serialNum.setFixedWidth(300)
      
      font = QFont()
      title = QLabel("Project Details")
      title.setFont(font)
      layout.addWidget(title, 0,0)
      
      layout.addWidget(QLabel("Title"), 1,0)
      layout.addWidget(self.title, 1, 2)

      layout.addWidget(QLabel("Date (dd/mm/yy)"), 2, 0)
      layout.addWidget(self.date, 2, 2)

      layout.addWidget(QLabel("Name"), 3, 0)
      layout.addWidget(self.product, 3, 2)

      layout.addWidget(QLabel("Serial Number (if available)"), 4, 0)
      layout.addWidget(self.serialNum, 4, 2)

Ответы

1 alec Aug 18 2020 at 01:46

Поскольку вы храните указатели на каждый QLineEdit, вы можете получить доступ к их textсвойству в любое время. textChangedСигнал испускается , когда текст изменился, сигнал этого частый не нужен. Вместо этого подключите каждый editingFinishedсигнал к одному слоту, где всем клавишам присвоены значения.

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *

answers = {"title": "", "Date": "", "Product": "", "Serial Num": ""}

class Template(QWidget):

    def __init__(self):
        super().__init__()
        self.projectDetailsUI()
        
    def projectDetailsUI(self):
        layout = QGridLayout(self)
        self.title = QLineEdit()
        self.title.setFixedWidth(300)

        self.date = QLineEdit()
        self.date.setFixedWidth(120)

        self.product = QLineEdit()
        self.product.setFixedWidth(300)

        self.serialNum = QLineEdit()
        self.serialNum.setFixedWidth(300)

        font = QFont()
        title = QLabel("Project Details")
        title.setFont(font)
        layout.addWidget(title, 0,0)

        layout.addWidget(QLabel("Title"), 1,0)
        layout.addWidget(self.title, 1, 2)

        layout.addWidget(QLabel("Date (dd/mm/yy)"), 2, 0)
        layout.addWidget(self.date, 2, 2)

        layout.addWidget(QLabel("Name"), 3, 0)
        layout.addWidget(self.product, 3, 2)

        layout.addWidget(QLabel("Serial Number (if available)"), 4, 0)
        layout.addWidget(self.serialNum, 4, 2)

        self.title.editingFinished.connect(self.set_answers)
        self.date.editingFinished.connect(self.set_answers)
        self.product.editingFinished.connect(self.set_answers)
        self.serialNum.editingFinished.connect(self.set_answers)

    def set_answers(self):
        answers['title'] = self.title.text()
        answers['Date'] = self.date.text()
        answers['Product'] = self.product.text()
        answers['Serial Num'] = self.serialNum.text()
            

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Template()
    window.show()
    sys.exit(app.exec_())