跳至正文
View Categories

2 min read

    主要内容 #

  1. QTableView展示分析结果

完成效果 #

本节课程是字数统计小程序的第三节,完成本节课程,能实现将文本分析结果展示在QTableview中。

收获 #

学习完本节内容,我们会了解QTableview的创建方法,并在其中展示统计结果。

1.QTableView展示分析结果 #

QTableView类用于以表格形式输出信息,可通过自定义的数据模型(本例中选择QStandardItemModel)来显示数据,通过setModel来绑定数据源。
QStandardItemModel 是标准的以项数据(item data)为基础的标准数据模型类,通常与 QTableView 组合成 Model/View 结构,实现通用的二维数据的管理功能。具体解释如下:

  • QStandardItemModel:基于项数据的标准数据模型,可以处理二维数据。维护一个二维的项数据数组,每个项是一个 QStandardltem 类的变量,用于存储项的数据、字体格式、对齐方式等。
  • QTableView:二维数据表视图组件,有多个行和多个列,每个基本显示单元是一个单元格,通过 setModel() 函数设置一个 QStandardItemModel 类的数据模型之后,一个单元格显示 QStandardItemModel 数据模型中的一个项。
  • 以下为示例代码:

    from PyQt5.QtWidgets import QWidget, QTextEdit, QVBoxLayout, QFileDialog, QHeaderView, QApplication, QPushButton, QTableView
    from PyQt5.QtGui import QStandardItemModel, QStandardItem
    import sys, csv
    
    class Example(QWidget):
        def __init__(self):
            super().__init__()
            self.initUI()
    
        def initUI(self):
            button = QPushButton('分析')  # 添加一个按钮
            # 点击按钮,触发clicked信号,连接到槽函数getAnalyse
            button.clicked.connect(self.getAnalyse)
            textEdit = QTextEdit()  # 创建一个多行文本编辑框
            self.layout = QVBoxLayout()  # 创建一个垂直盒布局
            self.layout.addWidget(button)  # 将按钮添加到布局中
            self.layout.addWidget(textEdit)  # 将文本编辑框添加到文本中
            self.setLayout(self.layout)  # 将布局应用到程序窗口
            filename, filetype = QFileDialog.getOpenFileName(self, '打开文件', 'D:\\Python_Tips\\Dashima\\pics', 'Text Files (*.txt)')  # 弹出打开文件对话框
            if filename:  # 如果文件名不为空,即选择了一个文件
                # 则打开并读取名为filename的文件内容,encoding='utf-8 可以兼容中文
                with open(filename, 'r', encoding='utf-8') as data:  # 则打开并读取名为filename的文件内容,encoding='utf-8 可以兼容中文
                    self.content = data.read()  # read方法可以读取txt文档的所有内容
            textEdit.setText(self.content)  # 把文档内容显示在文本框中
            self.table = QTableView()  # 创建一个QTableView对象
            self.setGeometry(300, 300, 500, 800)
            self.setWindowTitle('字数统计小程序')
            self.show()
    
        def getAnalyse(self):  # 槽函数 用来分析统计文本字数
            content2 = set(self.content)  # set函数去除文本内容中的重复文字
            content2 = list(content2)  # 再转化为列表
            self.countList = []  # 用来储存统计结果
            for i in content2:  # 遍历content2的每一个字符
                # ' ' 是空格, '\n' 是换行符, '\u3000'是全角的空格符,三者都不属于我们能看见的字符,无需统计
                if i == ' ' or i == '\n' or i == '\u3000':
                    continue  # 直接跳到下一次循环
                m = self.content.count(i)  # count()方法计算字符i在self.content中出现的次数
                self.countList.append((m, i))  # 将出现的次数和对应文字组成元组,并添加到统计列表countList中
            self.countList.sort(reverse=True)  # 将统计列表,按照出现的次数降序排列
            self.numItem = len(self.countList)  # 获取统计列表的长度
            self.model = QStandardItemModel(self.numItem, 2)  # 创建一个模型实例
            self.model.setHorizontalHeaderLabels(['出现次数', '文本'])  # 设置表头的名称
            for row in range(self.numItem):  # 循环一次给模型的每一个位置赋值
                for column in range(2):
                    # 获取数据,column=0时是文字出现次数,column=1时是该文字
                    item = self.countList[row][column]
                    # 给模型的第row行,第column列添加数据
                    self.model.setItem(row, column, QStandardItem(str(item)))
            self.table.setModel(self.model)  # 将模型应用到tableview上去
            # 让表格的所有列自动拉伸,充满界面
            self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
            self.layout.addWidget(self.table)  # 将tableview加到布局中
    
    app = QApplication(sys.argv)  # 创建应用程序
    ex = Example()  # 创建窗口对象
    sys.exit(app.exec_())  # 设置关闭窗口后结束进程

    拓展练习:尝试更改各个控件的布局。

    小结 #

  • 学习了如何创建QTableView。
  • 学习了如何让QTableView展示指定数据。
  • 习题 #

    1. 习题1:尝试自定义一个txt文件,进行词频统计并排序,然后QTableView展示结果。