无法填充 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 本书(小部件),你把它放在壁橱里(类似于布局),你认为将它们放在另一个盒子里意味着将创建新的副本。
我真的不明白为什么 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 本书(小部件),你把它放在壁橱里(类似于布局),你认为将它们放在另一个盒子里意味着将创建新的副本。