如何同步ui和数据(字典)

时间:2018-03-17 19:13:07

标签: python pyqt5

我有一个字典,其中包含我用来填充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

1 个答案:

答案 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确实有助于代码架构。