我有一个字典,其中包含我用来填充PyQt5中的表的数据。 该表看起来大致如下:
| Material | Amount |
+----------+--------+
| Iron | 20 |
| ... | ... |
现在我的问题是,如何通过表内的UI进行的更改可以与字典同步。 E. g。:通过UI,我将铁的金额值更改为30.这也应该更新字典。
编辑:例如触发一个on change事件或类似的东西,它将读取表并创建一个新的字典,替换旧的字典。 (这似乎很费力)
我使用以下代码创建表:
self.allMaterials = json.load(open('materials.json')) # reads json file that contains all materials and there amounts
for rowIndex, rawMaterial in enumerate(self.allMaterials["materials"]["raw"]):
itemName = QtWidgets.QTableWidgetItem(rawMaterial["name"]) # fills cell with material name
itemName.setFlags(QtCore.Qt.ItemIsEnabled) # makes cell read only
itemAmount = QtWidgets.QTableWidgetItem() # creates widget for cell
itemAmount.setData(QtCore.Qt.EditRole, rawMaterial["amount"]) # fills material amount and makes it editable
self.tableMatRaw.setItem(rowIndex, 0, itemName) # positioning cell
self.tableMatRaw.setItem(rowIndex, 1, itemAmount) # positioning cell
答案 0 :(得分:1)
在初始化中使用pyqtSignal
定义为value_changed = pyqtSignal(int)
。
当值改变时,UI应该调用一个函数,比如说
def change_UI_value(new_value, ...):
# Update UI dictionary...
# When a signal is emitted, you pass a int value
value_changed.emit(sig_value)
然后你应该有一个由信号触发的功能
def update_dict(sig_value):
# Get Material and value to update
dict[material] = value
最后,在信号和它触发的函数value_changed[int].connect(update_dict)
之间添加一个连接。
更新数据字典时,您可以通过信号传递行或尝试通过信号传递元组(从未尝试但值得一试)。
无论如何,pyqtSignal确实有助于代码架构。