为每一行更新网格中标签的按钮

Buttons that update labels in a grid for each respective row

我有一个 2 列 3 行的 QGrid。第一列由 QPushButtons 组成,第二列由 QLabel 组成。 按钮 => ["This Button"、"That Button"、"A Button"]。所有标签都从文本 0 开始。按一行中的按钮应该通过加 1 来更改同一行中标签的文本(数字)。

以上是问题的简化版本,实际上我有 10 多行和 5 多列。

如何使用尽可能少的代码在网格中创建所有这些行和列?我如何 link 每个按钮到它各自的标签,而不必为每个单独的按钮创建一个函数?

有几种方法可以解决,我会展示一些:

  1. lambda 函数:

class Widget(QWidget):
    def __init__(self, *args, **kwargs):
        QWidget.__init__(self, *args, **kwargs)
        lay = QGridLayout(self)
        for i in range(3):
            btn = QPushButton("button-{}".format(i), self)
            lbl = QLabel("{}".format(0))
            lay.addWidget(btn, i, 0)
            lay.addWidget(lbl, i, 1)
            btn.clicked.connect(lambda checked, l=lbl: self.fun(l))

    def fun(self, lbl):
        n = int(lbl.text()) + 1
        lbl.setText(str(n))
  1. 词典

class Widget(QWidget):
    def __init__(self, *args, **kwargs):
        QWidget.__init__(self, *args, **kwargs)
        lay = QGridLayout(self)
        self.connections = {}
        for i in range(3):
            btn = QPushButton("button-{}".format(i), self)
            lbl = QLabel("{}".format(0))
            lay.addWidget(btn, i, 0)
            lay.addWidget(lbl, i, 1)
            self.connections[btn] = lbl
            btn.clicked.connect(self.fun)

    def fun(self):
        lbl = self.connections[self.sender()]
        n = int(lbl.text()) + 1
        lbl.setText(str(n))