#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, хм, понятно… Ход моих мыслей на самом деле шел в этом направлении, поэтому я искал подтверждения, прежде чем пытаться что-то еще. Благодаря вашим знаниям, мне удалось собрать все это вместе так, как я хотел. Мой обходной путь был немного «странным», но очень функциональным, так что спасибо за подсказку!!