无法填充 QGridLayout

Trouble populating a QGridLayout

我真的不明白为什么 widget_2 和 widget_3 在这个网格布局中只出现一次,它们应该出现 5 次(为了示例)如“widget_1" (QLabel) 做。我正在使用 for 循环和 zip() 函数来使用在名为“linha”的列表中的元组内生成的小部件来填充此网格布局,我得到的结果是这样的:

我知道如果我去的话:

linha = [(QLabel("anything goes"), QspinBox(), QComboBox() for i in range(5)]

它会工作,但问题是我需要小部件 2 和 3 成为 MRE 显示的 class 属性。如果您知道如何帮助我或有任何改进此代码的想法,请与我们分享,您会让我开心

这是一个 MRE,如果需要,您可以将其复制并粘贴到 运行

import sys
from PyQt5.QtWidgets import (QWidget, QApplication, QGridLayout,
                             QSpinBox, QComboBox, QVBoxLayout, QLabel)

class example(QWidget):

    def __init__(self):
        super().__init__()

        self.grid_layout_test()

    def grid_layout_test(self):

        layout = QVBoxLayout()
        self.widget_2 = QSpinBox()
        self.widget_3 = QComboBox()
        self.grid_layout = QGridLayout()

        lst = []

        opts = ['a', 'b', 'c', 'd', 'e']

        [self.widget_3.addItem(opt) for opt in opts]

        linha = [(QLabel("N°: " + str(i + 1)), self.widget_2, self.widget_3) for i in range(5)]
        posicoes = [(i, j) for i in range(5) for j in range(3)]

        for widgets in linha:
            for widget in widgets:
                lst.append(widget)

        for pos, ele in zip(posicoes, lst):
            self.grid_layout.addWidget(ele, *pos)

        layout.addLayout(self.grid_layout)
        self.setLayout(layout)


def main():

    app = QApplication(sys.argv)
    run = example()
    run.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

I really don't understand the reason why widget_2 and widget_3 shows up only once in this grid layout

因为你只创建了一个 QSpinBox 和 QComboBox,你只是在复制引用,而在 QGridLayout 的情况下,如果小部件已经被处理,那么它不会移动它或创建副本,我想这就是你想要,但这不是 Qt 的工作方式。

打个比方,你有 2 本书(小部件),你把它放在壁橱里(类似于布局),你认为将它们放在另一个盒子里意味着将创建新的副本。