【问题标题】:Create Groupboxes conditionally from lists从列表有条件地创建组框
【发布时间】:2019-10-10 12:53:48
【问题描述】:

我有以下自动生成的列表,我想使用 PyQt5 创建分组框:

Country = ['France', 'France', 'Germany', 'Austria', 'Austria','Spain', 'Portugal','Portugal','Portugal','Spain']
Date = ['26.04', '14.05', '25.02', '18.04','15.06','18.09', '15.05', '28.03', '09.09', '10.10']
Lines = ['Line1', 'Line2', 'Line3', 'Line4', 'Line5', 'Line6', 'Line7', 'Line8', 'Line9', 'Line10']

我知道我可以使用以下代码获得这种看起来像表格的 Groupbox:

import sys
from PyQt5 import QtGui, QtCore, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

class MainWindow(QMainWindow):

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

        Country = ['France', 'France', 'Germany', 'Austria', 'Austria','Spain', 'Portugal','Portugal','Portugal','Spain']
        Date = ['26.04', '14.05', '25.02', '18.04','15.06','18.09', '15.05', '28.03', '09.09', '10.10']
        Lines = ['Line1', 'Line2', 'Line3', 'Line4', 'Line5', 'Line6', 'Line7', 'Line8', 'Line9', 'Line10']


        self.setGeometry(100, 100, 800, 600)
        self.setWindowTitle('Window')
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)
        self.mainB  = QHBoxLayout()


        self.GB1 = QGroupBox("")
        self.GB1.setStyleSheet('QGroupBox {'
                 'border: 0px solid gray; }')
        self.GB1.setFixedHeight(250)
        self.GB1.setFixedWidth(250)

        self.mainB.addWidget(self.GB1)

        grid1 = QGridLayout()
        for i in range(0,len(Country)):
           grid1.addWidget(QLabel(Country[i]), i, 0)
           grid1.addWidget(QLabel(Date[i]), i, 1)
           grid1.addWidget(QLabel(Lines[i]), i, 2)


        self.GB1.setLayout(grid1)

        self.centralWidget.setLayout(self.mainB)


def main():
    app = QApplication([])
    mainWin = MainWindow()
    mainWin.show()
    app.exec_()

if __name__ == '__main__':
   main()

但是,当该国家/地区连续出现时,我想创建组合框,它将与第一个列表中的相同“国家/地区”相对应的元素组合起来。

通过查看下面我打算做的示例来可视化它可能会更好:

有没有办法自动生成这些分组框以达到预期的效果?

【问题讨论】:

    标签: python pyqt pyqt5 qgroupbox


    【解决方案1】:

    解决方案的关键是对数据进行分组,在这种情况下,我使用一个字典,其中每个键是国家,它的值是日期和行元组的列表。

    import sys
    from PyQt5 import QtGui, QtCore, QtWidgets
    
    
    class MainWindow(QtWidgets.QMainWindow):
        def __init__(self):
            super().__init__()
    
            Country = ['France', 'France', 'Germany', 'Austria', 'Austria','Spain', 'Portugal','Portugal','Portugal','Spain']
            Date = ['26.04', '14.05', '25.02', '18.04','15.06','18.09', '15.05', '28.03', '09.09', '10.10']
            Lines = ['Line1', 'Line2', 'Line3', 'Line4', 'Line5', 'Line6', 'Line7', 'Line8', 'Line9', 'Line10']
    
            central_widget = QtWidgets.QWidget()
            self.setCentralWidget(central_widget)
    
            lay = QtWidgets.QVBoxLayout(central_widget)
    
            d = {}
            for country, date, line in zip(Country, Date, Lines):
                if country in d:
                    d[country].append((date, line))
                else:
                    d[country] = [(date, line)]
    
            for country, content in d.items():
                groub_box = QtWidgets.QGroupBox(country)
                grid_layout = QtWidgets.QGridLayout()
                groub_box.setLayout(grid_layout)
                lay.addWidget(groub_box)
    
                for row, (date, line) in enumerate(content):
                    grid_layout.addWidget(QtWidgets.QLabel(date), row, 0)
                    grid_layout.addWidget(QtWidgets.QLabel(line), row, 1)
    
    
    def main():
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
        mainWin = MainWindow()
        mainWin.show()
        sys.exit(app.exec_())
    
    
    if __name__ == "__main__":
        main()
    

    【讨论】:

    • 感谢您的帮助和解释。它按预期工作。
    • 我不知道我是否应该为此打开另一个问题,但我想知道如果有另一个列表 Colors = ['R', 'G', 'R', 'G', 'G', 'G', 'R', 'R', 'G', 'R'] 确定要添加到将要添加的标签的图像怎么办组框内。具体来说,可以重现以下内容:if Colors[0] == 'R': QLabel().setPixmap(QPixmap("./Icons/Red.png")) 或绿色代表“G”。
    • @SdJunk 首先我建议您尝试解决它,这将作为学习。当您无法实施它时,您只能将 SO 作为最后的手段。许多人认为(我的情况也是如此)OP 必须努力解决您的问题,在您最初的问题中,我看到了您的努力,但在您的最后一个请求中,我没有看到。
    • 我完全理解这一点。从我得到你的第一个答案的那一刻起,我一直在尝试解构代码,以便我可以理解如何实现它。通过查看代码,我认为我应该查看代码的最后一部分,但我很难确定在将标签添加到布局之前应该如何准确地更新它。我在将它添加到布局时尝试 setPixmap,但显然它不起作用。在此期间,我会继续努力解决它。
    • @SdJunk 分析我的代码的每一行做了什么,如果你意识到我已经留出了空间来观察有代码块,那么分析每个代码块的作用(老派理解代码的技巧是打印作为修改代码各部分中的变量,或对某个部分进行注释以理解该部分代码)。另外我想你应该知道基本的python,例如它会压缩、字典的操作、枚举等,如果你不知道,那么最好在Qt之前花时间学习基本的python。
    猜你喜欢
    • 1970-01-01
    • 2021-12-28
    相关资源
    最近更新 更多