Come memorizzare le risposte PyQt5 QLineEdit in un dizionario in posizioni specifiche nel dizionario
Ho utilizzato diverse modifiche alla riga per ottenere informazioni dall'utente. So di poter creare un segnale usando textchanged() e quindi collegarlo a uno slot in cui posso estrarre il testo che l'utente ha inserito per quella riga di modifica.
Ma ora supponiamo di voler memorizzare le informazioni ottenute dalle modifiche di riga specifica in un dizionario. Ad esempio, l'utente risponde a self.title = QLineEdit()
, questo si collega a uno slot che popola la risposta nella chiave "titolo" del dizionario. Se l'utente risponde a self.product= QLineEdit()
, questo si collega allo stesso slot di prima, ma ora popola la risposta nella chiave "Prodotto" del dizionario. Allo stesso modo, se in seguito vengono apportate modifiche a quelle modifiche di riga, il dizionario dovrebbe aggiornarsi con le nuove risposte.
Come posso fare questo? Voglio evitare di creare slot separati per ogni singolo QlineEdit in quanto ciò può essere noioso.
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)
Risposte
Dal momento che stai mantenendo i puntatori a ogni QLineEdit puoi accedere alla loro text
proprietà in qualsiasi momento. Il textChanged
segnale viene emesso ogni volta che il testo viene modificato, un segnale così frequente non è necessario. editingFinished
Collega invece il segnale di ciascuno a un singolo slot in cui a tutti i tasti vengono assegnati valori.
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_())