Cara menyimpan tanggapan PyQt5 QLineEdit ke dalam kamus di lokasi tertentu dalam kamus

Aug 18 2020

Saya telah menggunakan beberapa baris pengeditan untuk mendapatkan informasi dari pengguna. Saya tahu saya dapat membuat sinyal menggunakan textchanged () dan kemudian menghubungkannya ke slot tempat saya dapat mengekstrak teks yang dimasukkan pengguna untuk pengeditan baris tersebut.

Tetapi sekarang misalkan saya ingin menyimpan informasi yang diperoleh dari pengeditan baris tertentu ke dalam kamus. Misalnya, pengguna menjawab self.title = QLineEdit(), ini menghubungkan ke slot yang mengisi respons dalam kunci "judul" kamus. Jika pengguna menjawab self.product= QLineEdit(), ini menghubungkan ke slot yang sama seperti sebelumnya, tapi sekarang mengisi respon dalam kunci "Produk" kamus. Serupa, jika ada perubahan yang dilakukan pada pengeditan baris itu nanti, kamus harus memperbarui dengan tanggapan baru.

Bagaimana saya bisa melakukan ini? Saya ingin menghindari membuat slot terpisah untuk setiap QlineEdit karena ini bisa membosankan.

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)

Jawaban

1 alec Aug 18 2020 at 01:46

Karena Anda menyimpan petunjuk ke setiap QLineEdit, Anda dapat mengakses textpropertinya kapan saja. The textChangedsinyal dipancarkan setiap kali teks berubah sama sekali, sinyal ini sering tidak diperlukan. Alih-alih, hubungkan editingFinishedsinyal masing-masing ke satu slot di mana semua kunci diberi nilai.

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