कैसे शब्दकोश में विशिष्ट स्थानों में एक शब्दकोश में PyQt5 QLineEdit प्रतिक्रियाओं को संग्रहीत करने के लिए

Aug 18 2020

मैं उपयोगकर्ता से जानकारी प्राप्त करने के लिए कई लाइन संपादन का उपयोग कर रहा हूं। मुझे पता है कि मैं textchanged () का उपयोग करके एक सिग्नल बना सकता हूं और फिर इसे एक स्लॉट से कनेक्ट कर सकता हूं जहां मैं उस लाइन एडिट के लिए उपयोगकर्ता द्वारा डाले गए टेक्स्ट को निकाल सकता हूं।

लेकिन अब मान लीजिए कि मैं विशिष्ट पंक्ति से प्राप्त जानकारी को एक शब्दकोश में संग्रहीत करना चाहता हूं। उदाहरण के लिए, उपयोगकर्ता उत्तर देता है self.title = QLineEdit(), यह एक स्लॉट से जुड़ता है जो शब्दकोश की "शीर्षक" कुंजी में प्रतिक्रिया को पॉप्युलेट करता है। यदि उपयोगकर्ता उत्तर देता है self.product= QLineEdit(), तो यह पहले की तरह ही स्लॉट से जुड़ता है, लेकिन अब शब्दकोश की "उत्पाद" कुंजी में प्रतिक्रिया को पॉप्युलेट करता है। सिमिलरी, यदि बाद में उन पंक्ति संपादन में कोई परिवर्तन किया जाता है, तो शब्दकोश को नई प्रतिक्रियाओं के साथ अद्यतन करना चाहिए।

मैं यह कैसे कर सकता हूँ? मैं हर एक 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_())