Cómo almacenar las respuestas PyQt5 QLineEdit en un diccionario en ubicaciones específicas en el diccionario
He estado usando varias ediciones de línea para obtener información del usuario. Sé que puedo crear una señal usando textchanged() y luego conectarla a una ranura donde puedo extraer el texto que el usuario puso para editar esa línea.
Pero ahora supongamos que quiero almacenar esa información obtenida de las ediciones de línea específicas en un diccionario. Por ejemplo, el usuario responde el self.title = QLineEdit()
, esto se conecta a una ranura que completa la respuesta en la tecla "título" del diccionario. Si el usuario responde al self.product= QLineEdit()
, esto se conecta a la misma ranura que antes, pero ahora completa la respuesta en la clave "Producto" del diccionario. De manera similar, si se realizan cambios en esas ediciones de línea más adelante, el diccionario debería actualizarse con las nuevas respuestas.
¿Cómo puedo hacer esto? Quiero evitar crear ranuras separadas para cada QlineEdit, ya que esto puede ser tedioso.
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)
Respuestas
Dado que mantiene punteros para cada QLineEdit, puede acceder a su text
propiedad en cualquier momento. La textChanged
señal se emite cada vez que se cambia el texto, una señal tan frecuente no es necesaria. En su lugar, conecte la editingFinished
señal de cada uno a una sola ranura donde se asignan valores a todas las teclas.
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_())