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