Comment stocker les réponses PyQt5 QLineEdit dans un dictionnaire à des emplacements spécifiques dans le dictionnaire

Aug 18 2020

J'ai utilisé plusieurs modifications de ligne pour obtenir des informations de l'utilisateur. Je sais que je peux créer un signal en utilisant textchanged(), puis le connecter à un emplacement où je peux extraire le texte que l'utilisateur a inséré pour cette modification de ligne.

Mais supposons maintenant que je veuille stocker ces informations obtenues à partir des modifications de ligne spécifiques dans un dictionnaire. Par exemple, l'utilisateur répond au self.title = QLineEdit(), cela se connecte à un slot qui remplit la réponse dans la clé "title" du dictionnaire. Si l'utilisateur répond à self.product= QLineEdit(), cela se connecte au même emplacement qu'auparavant, mais remplit désormais la réponse dans la clé "Produit" du dictionnaire. De même, si des modifications sont apportées ultérieurement à ces modifications de ligne, le dictionnaire doit être mis à jour avec les nouvelles réponses.

Comment puis-je faire ceci? Je veux éviter de créer des emplacements séparés pour chaque QlineEdit car cela peut être fastidieux.

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)

Réponses

1 alec Aug 18 2020 at 01:46

Puisque vous conservez des pointeurs vers chaque QLineEdit, vous pouvez accéder à leur textpropriété à tout moment. Le textChangedsignal est émis chaque fois que le texte est modifié, un signal aussi fréquent n'est pas nécessaire. Au lieu de cela, connectez le signal de chacun editingFinishedà un seul emplacement où toutes les touches sont affectées de valeurs.

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