如何为我在PyQt5中添加的每个列表创建一个小部件或框架?

时间:2017-07-02 03:19:04

标签: python for-loop pyqt pyqt5

实际上,我遇到的问题是你们中的一些人可能觉得简单,说实话我不知道为什么我无法解决它...我实际上已经尝试过了一切!

首先,这是我的代码:

class UpdateFrame(QtWidgets.QFrame):

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

        self.setStyleSheet('background-color: white;'
                           'border: 0px solid #4f4f51;'
                           'border-radius: 0px;'
                           'margin: 0px;'
                           'padding: 0px;')

        self.setLayout(QtWidgets.QVBoxLayout())

        for conteudo in range (20):
            self.layout().addWidget(ListFrame(update_list=["test1", "test2", "test3", "test4", "test5"]))


class ListFrame(QtWidgets.QFrame):
    def __init__(self, update_list):
        super().__init__()

        self.setStyleSheet('.ListFrame{background-color: white;'
                                    'border: 1px solid #4f4f51;'
                                    'border-radius: 0px;'
                                    'margin: 2px;'
                                    'padding: 2px}')


        self.setMinimumSize(500, 150)
        self.setLayout(QtWidgets.QVBoxLayout())
        self.layout().addWidget(_Secao(update_list, max_conteudo_exibido_int=5))

class _Secao(QtWidgets.QFrame):
    def __init__ (self, conteudo_list, titulo_stylesheet = 'QLabel {color: black; font-weight: bold}', max_conteudo_exibido_int = 100 ):
        super().__init__()

        self.setLayout(QtWidgets.QGridLayout())

        _content_frame = QtWidgets.QFrame()
        _content_frame.setLayout(QtWidgets.QVBoxLayout())
        _content_frame.setFixedWidth(380)
        conteudo_a_ser_exibido = conteudo_list[:max_conteudo_exibido_int]

        if len(conteudo_list) == 0:
            _content_frame.layout().addWidget(QtWidgets.QLabel('--'))
            self.layout().addWidget(_content_frame)

        elif len(conteudo_list) > len(conteudo_a_ser_exibido):
            _content_frame.layout().addWidget(QtWidgets.QLabel('...'))
            self.layout().addWidget(_content_frame)

        else:
            conteudo_a_ser_exibido = conteudo_list[2: max_conteudo_exibido_int]

            _titulo_label_01 = QtWidgets.QLabel('Versão: ')
            _titulo_label_02 = QtWidgets.QLabel('Data: ')

            _titulo_label_1 = QtWidgets.QLabel(conteudo_list[0])
            _titulo_label_2 = QtWidgets.QLabel(conteudo_list[1])

            _titulo_label_01.setStyleSheet(titulo_stylesheet)
            _titulo_label_02.setStyleSheet(titulo_stylesheet)

            _titulo_label_1.setStyleSheet(titulo_stylesheet)
            _titulo_label_2.setStyleSheet(titulo_stylesheet)

            self.layout().addWidget(_titulo_label_01, 0, 0)
            self.layout().addWidget(_titulo_label_02, 0, 2)
            self.layout().addWidget(_titulo_label_1, 1, 0)
            self.layout().addWidget(_titulo_label_2, 1, 2)

            for conteudo in conteudo_a_ser_exibido:
                label_list = QtWidgets.QLabel(conteudo)
                label_list.setWordWrap(True)
                _content_frame.layout().addWidget(label_list)

                self.layout().addWidget(_content_frame, 2, 0)
            self.layout().addItem(QtWidgets.QSpacerItem(0, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding))

所以,现在,此代码创建了一个窗口,显示由"test1", "test2", "test3", "test4", "test5"创建的框架内的列表class ListFrame(QtWidgets.QFrame)

这个列表由update_list调用,class UpdateFrame(QtWidgets.QFrame):for内调用,并根据{{1}中的int创建相同的小部件我之前选择的(在我的例子中,20次);

所以,这就是我要做的事情:我需要这个range函数接收一个列表(而不是一个数字),其中包含几个列表并且每个列表都包含这些列表GUI创建一个包含这些内容的新窗口小部件。

例如:

  

[[" test1"," test2"," test3"," test4"," test5"] ,[" test6"," test7"," test8"," test9"," test10"]]

并且有了这个,将有2个小部件,每个小部件都有自己的内容。

我相信我的困难在于我从未使用过列表中的列表并且这样做会让我的大脑紧张。

感谢大家的期待,感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

所以你的循环

for conteudo in range (20):
    self.layout().addWidget(ListFrame(update_list=["test1", "test2", "test3", "test4", "test5"]))

替换为

for lst in list_of_lists:
    self.layout().addWidget(ListFrame(update_list=lst))

(我给你的名字list_of_lists

[["test1", "test2", "test3", "test4", "test5"], ["test6", "test7", "test8", "test9", "test10"]]