วิธีจัดเก็บคำตอบของ PyQt5 QLineEdit ลงในพจนานุกรมตามตำแหน่งเฉพาะในพจนานุกรม
ฉันใช้การแก้ไขหลายบรรทัดเพื่อรับข้อมูลจากผู้ใช้ ฉันรู้ว่าฉันสามารถสร้างสัญญาณโดยใช้ textchanged () จากนั้นเชื่อมต่อกับช่องที่ฉันสามารถดึงข้อความที่ผู้ใช้ใส่ไว้สำหรับการแก้ไขบรรทัดนั้นได้
แต่ตอนนี้สมมติว่าฉันต้องการเก็บข้อมูลที่ได้รับจากการแก้ไขบรรทัดเฉพาะลงในพจนานุกรม ตัวอย่างเช่นผู้ใช้ตอบคำถามself.title = QLineEdit()
นี้เชื่อมต่อกับช่องที่เติมคำตอบในคีย์ "title" ของพจนานุกรม หากผู้ใช้ตอบคำถาม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)
คำตอบ
เนื่องจากคุณรักษาคำแนะนำสำหรับ 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_())