Проблема с заполнением QGridLayout

#python #pyqt #pyqt5 #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. Если вы знаете, как мне помочь или у вас есть какие-либо идеи, как улучшить этот код, пожалуйста, поделитесь им с нами, вы сделаете мой день лучше

Это 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()  

Ответ №1:

Я действительно не понимаю причину, по которой widget_2 и widget_3 отображаются только один раз в этом макете сетки

Поскольку вы создали только QSpinBox и QComboBox, вы копируете только ссылку, и в случае QGridLayout, если виджет уже обработан, он не перемещает его и не создает копии, я думаю, что вам бы этого хотелось, но это не так, как работает Qt.

Сравнение может заключаться в том, что у вас есть 2 книги (виджеты), и вы помещаете их в шкаф (что-то вроде макета), и вы думаете, что размещение их в другой коробке подразумевает, что будут созданы новые копии.

Комментарии:

1. Добрый вечер @eyllanesc, хм, понятно… Ход моих мыслей на самом деле шел в этом направлении, поэтому я искал подтверждения, прежде чем пытаться что-то еще. Благодаря вашим знаниям, мне удалось собрать все это вместе так, как я хотел. Мой обходной путь был немного «странным», но очень функциональным, так что спасибо за подсказку!!