Como armazenar respostas PyQt5 QLineEdit em um dicionário em locais específicos no dicionário
Eu tenho usado várias edições de linha para obter informações do usuário. Sei que posso criar um sinal usando textchanged () e conectá-lo a um slot onde posso extrair o texto que o usuário colocou para essa edição de linha.
Mas agora suponha que eu queira armazenar as informações obtidas das edições de linha específicas em um dicionário. Por exemplo, o usuário responde a self.title = QLineEdit()
, isso se conecta a um slot que preenche a resposta na chave "título" do dicionário. Se o usuário responder a self.product= QLineEdit()
, isso se conectará ao mesmo slot de antes, mas agora preencherá a resposta na chave "Produto" do dicionário. Da mesma forma, se alguma alteração for feita nessas edições de linha posteriormente, o dicionário deverá ser atualizado com as novas respostas.
Como posso fazer isso? Eu quero evitar a criação de slots separados para cada QlineEdit, pois isso pode 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)
Respostas
Como você mantém ponteiros para cada QLineEdit, você pode acessar suas text
propriedades a qualquer momento. O textChanged
sinal é emitido sempre que o texto é alterado, um sinal tão frequente não é necessário. Em vez disso, conecte o editingFinished
sinal de cada um a um único slot onde todas as chaves recebem valores.
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_())