PyQt5中的Table view详解

1. 基础概念和用途

1.1 基本定义

  • 二维表格数据展示:Table View 用于以行和列的形式展示数据,每个单元格可以包含文本、图像、复选框等内容。
  • 数据交互:用户可以与表格数据进行交互,例如选择单元格、编辑内容、排序和过滤数据等。

1.2 组成部分

  • QTableView:这是一个显示二维表格的窗口部件,负责表格的外观和基本行为。
  • 数据模型 (Model):这是表格数据的实际存储和管理部分。在 PyQt5 中,常用的模型有 QStandardItemModelQAbstractTableModel
  • 委托 (Delegate):用于自定义单元格的显示和编辑行为,默认的委托可以处理常见的数据类型(如文本、数字等),但用户可以创建自定义委托来处理特殊类型的数据。

1.3 常见用途

  • 数据展示:适用于展示结构化的数据,如数据库查询结果、Excel 表格内容、财务报表等。
  • 数据编辑:允许用户直接在表格中编辑数据,适用于数据输入和修改场景。
  • 数据分析:用于展示和分析数据,如统计数据表、数据对比表等。

1.4 Table View 的主要特点

  • 可视化数据:通过表格形式直观地展示数据,便于用户理解和操作。
  • 数据交互:支持单元格选择、行列排序、数据过滤等交互功能,提高用户体验。
  • 可编辑性:允许用户直接在表格中编辑数据,方便数据修改和维护。
  • 扩展性和定制性:通过模型-视图-委托的架构,提供了高度的灵活性,用户可以自定义数据模型和单元格外观。

1.5 一个简单示例

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView
from PyQt5.QtGui import QStandardItemModel, QStandardItem

# 定义一个继承自QMainWindow的类,表示主窗口
class TableViewDemo(QMainWindow):
    def __init__(self):
        super().__init__()  # 调用父类的构造函数,初始化QMainWindow
        
        # 设置窗口标题
        self.setWindowTitle('Table View Example')
        # 设置窗口的位置和大小 (x, y, width, height)
        self.setGeometry(100, 100, 600, 400)
        # 调用方法创建表格视图
        self.createTable()

    def createTable(self):
        # 创建一个QTableView对象,作为表格视图
        table_view = QTableView(self)
        
        # 创建一个QStandardItemModel对象,指定行数和列数
        model = QStandardItemModel(4, 3)
        # 设置水平表头标签
        model.setHorizontalHeaderLabels(['Column 1', 'Column 2', 'Column 3'])
        
        # 填充表格数据
        for row in range(4):  # 遍历行
            for column in range(3):  # 遍历列
                # 创建一个QStandardItem对象,表示单元格内容
                item = QStandardItem(f'Item {row}, {column}')
                # 将单元格内容添加到模型的指定位置
                model.setItem(row, column, item)
        
        # 将模型设置到表格视图
        table_view.setModel(model)
        # 将表格视图设置为主窗口的中央组件
        self.setCentralWidget(table_view)

# 程序入口
if __name__ == "__main__":
    # 创建QApplication对象,管理应用程序的控制流和主设置
    app = QApplication(sys.argv)
    # 创建TableViewDemo对象,表示主窗口
    window = TableViewDemo()
    # 显示主窗口
    window.show()
    # 进入应用程序的主循环,直到exit()被调用
    sys.exit(app.exec_())

运行结果如下:

在这里插入图片描述

2 QTableView 组件的基本功能和属性

2.1 功能属性描述

功能/属性描述
模型-视图架构QTableView 使用模型-视图-委托 (Model-View-Delegate) 架构,将数据和表示分离,提高灵活性和可扩展性。
显示数据通过设置模型 (如 QStandardItemModel 或 QAbstractTableModel),QTableView 可以显示任意二维表格数据。
单元格编辑支持在表格中直接编辑单元格数据,默认情况下,双击单元格即可进入编辑模式。
选择模式支持多种选择模式,包括单个单元格、多行、多列以及矩形区域选择,可以通过 setSelectionModesetSelectionBehavior 方法配置。
排序功能可以启用列排序功能,允许用户通过点击列标题对数据进行升序或降序排序。
标题支持水平和垂直标题,通过 setHorizontalHeaderLabelssetVerticalHeaderLabels 方法设置标题内容。
行高和列宽允许设置行高和列宽,可以通过 resizeRowsToContentsresizeColumnsToContents 方法自动调整大小,也可以手动设置。
隐藏/显示行列支持隐藏或显示特定的行和列,通过 setRowHiddensetColumnHidden 方法实现。
委托可以使用自定义委托 (QStyledItemDelegate) 来定制单元格的显示和编辑行为,适用于需要特殊格式或控件的单元格。
网格线支持显示或隐藏单元格之间的网格线,通过 setShowGrid 方法控制。
滚动和分页支持自动滚动,表格内容超过视图大小时可以显示滚动条,用户可以滚动查看所有数据。
选择颜色和样式通过 setStyleSheet 方法,可以自定义表格的外观,包括背景颜色、选中单元格的颜色等。
固定列和行支持固定列和行,使其在滚动时仍然保持可见,例如冻结表头或某些关键列。
信号和槽提供多种信号(如单元格点击、编辑开始和结束等),允许开发者连接到自定义槽函数以响应用户操作。

2.2 使用这些功能和属性

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView, QVBoxLayout, QWidget
from PyQt5.QtGui import QStandardItemModel, QStandardItem

class TableViewDemo(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('QTableView Features Example')
        self.setGeometry(100, 100, 800, 600)
        self.createTable()

    def createTable(self):
        table_view = QTableView(self)
        
        # 设置模型
        model = QStandardItemModel(4, 3)  # 4 行 3 列
        model.setHorizontalHeaderLabels(['Column 1', 'Column 2', 'Column 3'])
        
        for row in range(4):
            for column in range(3):
                item = QStandardItem(f'Item {row},{column}')
                model.setItem(row, column, item)
        
        table_view.setModel(model)
        
        # 启用列排序
        table_view.setSortingEnabled(True)
        
        # 设置选择模式和行为
        table_view.setSelectionMode(QTableView.SingleSelection)
        table_view.setSelectionBehavior(QTableView.SelectRows)
        
        # 自动调整行高和列宽
        table_view.resizeRowsToContents()
        table_view.resizeColumnsToContents()
        
        # 隐藏第二列
        table_view.setColumnHidden(1, True)
        
        # 显示网格线
        table_view.setShowGrid(True)
        
        # 创建主窗口布局
        central_widget = QWidget()
        layout = QVBoxLayout(central_widget)
        layout.addWidget(table_view)
        self.setCentralWidget(central_widget)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = TableViewDemo()
    window.show()
    sys.exit(app.exec_())

运行结果如下:

在这里插入图片描述

3. QStandardItemModel

3.1 概念

​ 在 PyQt5 中,QStandardItemModel 是一个常用的数据模型类,用于管理和存储表格、树形结构等二维数据。它提供了一种灵活的方式来存储和操作数据,并将数据与视图(如 QTableView)分离。数据模型在模型-视图-委托 (Model-View-Delegate) 架构中扮演着重要角色,它负责存储数据并提供访问数据的方法。视图(如 QTableView)使用数据模型来获取和显示数据,而委托则负责数据的呈现和编辑。

QStandardItemModel 是 PyQt5 提供的一个标准实现,用于存储和管理二维表格数据。它使用 QStandardItem 对象来表示单元格的数据项。QStandardItemModel 提供了许多便捷的方法来操作数据,如添加、插入、删除和修改数据。

以下是 QStandardItemModel 的基本功能和使用方法:

  1. 创建模型:初始化模型并设置行和列的数量。
  2. 设置数据:使用 QStandardItem 对象设置单元格的数据。
  3. 访问数据:通过模型的各种方法访问和操作数据。

3.2 QStandardItemModel 的一些常用方法和属性

方法/属性描述
__init__(self, rows, columns)初始化模型,指定行数和列数。
setHorizontalHeaderLabels(self, labels)设置水平表头标签。
setVerticalHeaderLabels(self, labels)设置垂直表头标签。
setItem(self, row, column, item)在指定的单元格位置设置数据项 (QStandardItem)。
item(self, row, column)获取指定单元格位置的 QStandardItem 对象。
appendRow(self, items)添加一行数据,items 是一个 QStandardItem 对象的列表。
insertRow(self, row, items)在指定位置插入一行数据。
removeRow(self, row)移除指定行的数据。
rowCount(self)获取行数。
columnCount(self)获取列数。
clear(self)清除模型中的所有数据。
data(self, index, role=Qt.DisplayRole)获取指定索引和角色的数据。
setData(self, index, value, role=Qt.EditRole)设置指定索引和角色的数据。

3.3 QStandardItem 的使用

QStandardItem 是存储在 QStandardItemModel 中的单元格数据对象。它不仅可以存储文本,还可以存储图像、复选框等。以下是一些常用方法:

方法/属性描述
setText(self, text)设置单元格的文本内容。
text(self)获取单元格的文本内容。
setIcon(self, icon)设置单元格的图标。
setCheckable(self, checkable)设置单元格是否可选。
setCheckState(self, state)设置单元格的选中状态。
setEditable(self, editable)设置单元格是否可编辑。

4. 数据绑定和自定义数据模型

在 PyQt5 中,QAbstractTableModel 是一个抽象基类,用于创建自定义的数据模型。它提供了处理复杂数据源(如数据库、文件、API 等)的灵活性。通过继承 QAbstractTableModel,可以实现自己的数据模型,并覆盖其必要的方法以提供数据和处理用户交互。

4.1 创建自定义数据模型

要创建自定义的数据模型,需要继承 QAbstractTableModel 并实现以下方法:

方法描述
rowCount(self, parent)返回表格的行数。
columnCount(self, parent)返回表格的列数。
data(self, index, role)返回指定索引和角色的数据。
headerData(self, section, orientation, role)返回表头数据。
setData(self, index, value, role)设置指定索引和角色的数据(可选,若需要编辑功能)。
flags(self, index)返回指定索引的标志,用于指定单元格的属性(如可编辑、可选等)。

4.2 示例

数据库设置

首先,创建一个 SQLite 数据库,并插入一些示例数据:

import sqlite3

# 创建数据库连接
conn = sqlite3.connect('example.db')
cursor = conn.cursor()

# 创建表
cursor.execute('''
CREATE TABLE IF NOT EXISTS employees (
    id INTEGER PRIMARY KEY,
    name TEXT,
    age INTEGER,
    department TEXT
)
''')

# 插入示例数据
cursor.execute("INSERT INTO employees (name, age, department) VALUES ('John Doe', 30, 'HR')")
cursor.execute("INSERT INTO employees (name, age, department) VALUES ('Jane Smith', 25, 'IT')")
cursor.execute("INSERT INTO employees (name, age, department) VALUES ('Mike Johnson', 35, 'Finance')")

# 提交事务并关闭连接
conn.commit()
conn.close()

自定义数据模型

创建一个继承 QAbstractTableModel 的自定义数据模型,用于从 SQLite 数据库中读取数据并显示在 QTableView 中。

import sys
import sqlite3
from PyQt5.QtCore import Qt, QAbstractTableModel, QVariant
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView, QVBoxLayout, QWidget

class EmployeeTableModel(QAbstractTableModel):
    def __init__(self, data):
        super().__init__()
        self.data = data

    def rowCount(self, parent=None):
        return len(self.data)

    def columnCount(self, parent=None):
        return len(self.data[0]) if self.data else 0

    def data(self, index, role=Qt.DisplayRole):
        if not index.isValid():
            return QVariant()
        if role == Qt.DisplayRole:
            return self.data[index.row()][index.column()]
        return QVariant()

    def headerData(self, section, orientation, role=Qt.DisplayRole):
        headers = ["ID", "Name", "Age", "Department"]
        if role == Qt.DisplayRole:
            if orientation == Qt.Horizontal:
                return headers[section]
            else:
                return str(section + 1)
        return QVariant()

    def flags(self, index):
        return Qt.ItemIsSelectable | Qt.ItemIsEnabled

# 从数据库读取数据
def fetchData():
    conn = sqlite3.connect('example.db')
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM employees")
    rows = cursor.fetchall()
    conn.close()
    return rows

class TableViewDemo(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Custom QAbstractTableModel Example')
        self.setGeometry(100, 100, 600, 400)
        self.createTable()

    def createTable(self):
        data = fetchData()
        model = EmployeeTableModel(data)
        table_view = QTableView()
        table_view.setModel(model)
        
        # 设置主窗口布局
        central_widget = QWidget()
        layout = QVBoxLayout(central_widget)
        layout.addWidget(table_view)
        self.setCentralWidget(central_widget)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = TableViewDemo()
    window.show()
    sys.exit(app.exec_())

5. 功能增强

功能增强描述
交互功能添加单元格编辑、选择和删除功能,提高用户交互体验。
排序和过滤实现表格数据的排序和过滤功能,便于用户查找和管理数据。
自定义样式使用委托 (delegates) 自定义表格的显示和编辑样式,增强表格的美观度和可定制性。

5.1 交互功能

  • 单元格编辑:允许用户直接在表格中编辑数据,通过重写 setData 方法实现。
  • 选择功能:支持多种选择模式,如单选、多选、行选、列选等,可以通过 setSelectionModesetSelectionBehavior 方法设置。
  • 删除功能:允许用户删除选定的行或列,通过删除数据源中对应的数据实现。
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView, QVBoxLayout, QWidget, QPushButton, QAbstractItemView
from PyQt5.QtGui import QStandardItemModel, QStandardItem
from PyQt5.QtCore import Qt

class TableViewDemo(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle('Interactive Table View Example')
        self.setGeometry(100, 100, 800, 600)
        self.createTable()

    def createTable(self):
        # 创建主部件
        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)
        
        # 创建垂直布局
        self.layout = QVBoxLayout()
        self.central_widget.setLayout(self.layout)
        
        # 创建QTableView对象
        self.table_view = QTableView()
        self.layout.addWidget(self.table_view)
        
        # 创建QStandardItemModel对象,指定行数和列数
        self.model = QStandardItemModel(4, 3)
        self.model.setHorizontalHeaderLabels(['Column 1', 'Column 2', 'Column 3'])

        # 填充表格数据
        for row in range(4):
            for column in range(3):
                item = QStandardItem(f'Item {row}, {column}')
                self.model.setItem(row, column, item)

        # 设置模型到表格视图
        self.table_view.setModel(self.model)
        
        # 允许单元格编辑
        self.table_view.setEditTriggers(QAbstractItemView.DoubleClicked)
        
        # 设置选择模式和行为
        self.table_view.setSelectionMode(QAbstractItemView.SingleSelection)
        self.table_view.setSelectionBehavior(QAbstractItemView.SelectRows)
        
        # 添加删除按钮
        self.delete_button = QPushButton('Delete Selected Row')
        self.delete_button.clicked.connect(self.deleteRow)
        self.layout.addWidget(self.delete_button)

    def deleteRow(self):
        # 获取选中的索引
        selected_indexes = self.table_view.selectionModel().selectedRows()
        if selected_indexes:
            # 获取第一个选中的行索引
            index = selected_indexes[0].row()
            # 删除模型中的对应行
            self.model.removeRow(index)

    # 重写setData方法以允许数据编辑
    def setData(self, index, value, role=Qt.EditRole):
        if index.isValid() and role == Qt.EditRole:
            self.model.setData(index, value)
            return True
        return False

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = TableViewDemo()
    window.show()
    sys.exit(app.exec_())

运行结果如下:

在这里插入图片描述

5.2 排序和过滤

  1. 排序功能:允许用户通过点击表头对数据进行排序,通过重写 sort 方法实现。
  2. 过滤功能:允许用户输入关键字,在表格中实时过滤数据,通过重写 filterAcceptsRow 方法实现。
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView, QVBoxLayout, QWidget, QLineEdit
from PyQt5.QtGui import QStandardItemModel, QStandardItem
from PyQt5.QtCore import Qt, QSortFilterProxyModel

class TableViewDemo(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle('Sorting and Filtering Example')
        self.setGeometry(100, 100, 800, 600)
        self.createTable()

    def createTable(self):
        # 创建主部件
        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)
        
        # 创建垂直布局
        self.layout = QVBoxLayout()
        self.central_widget.setLayout(self.layout)
        
        # 创建QTableView对象
        self.table_view = QTableView()
        self.layout.addWidget(self.table_view)
        
        # 创建QStandardItemModel对象,指定行数和列数
        self.model = QStandardItemModel(4, 3)
        self.model.setHorizontalHeaderLabels(['Column 1', 'Column 2', 'Column 3'])

        # 填充表格数据
        for row in range(4):
            for column in range(3):
                item = QStandardItem(f'Item {row}, {column}')
                self.model.setItem(row, column, item)

        # 创建QSortFilterProxyModel对象
        self.proxy_model = QSortFilterProxyModel()
        self.proxy_model.setSourceModel(self.model)

        # 设置模型到表格视图
        self.table_view.setModel(self.proxy_model)
        self.table_view.setSortingEnabled(True)  # 启用排序功能

        # 创建过滤输入框
        self.filter_input = QLineEdit()
        self.filter_input.setPlaceholderText("Type to filter")
        self.filter_input.textChanged.connect(self.filterTextChanged)
        self.layout.addWidget(self.filter_input)

    def filterTextChanged(self, text):
        # 更新过滤关键字
        self.proxy_model.setFilterKeyColumn(-1)  # 过滤所有列
        self.proxy_model.setFilterCaseSensitivity(Qt.CaseInsensitive)
        self.proxy_model.setFilterWildcard(text)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = TableViewDemo()
    window.show()
    sys.exit(app.exec_())

运行结果如下:

在这里插入图片描述

5.3 自定义样式

  1. 单元格样式:通过委托 (delegates) 自定义单元格的显示样式,可以修改字体、颜色、背景等属性。
  2. 编辑样式:自定义单元格编辑时的样式,如输入框的大小、颜色、边框等。
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView, QVBoxLayout, QWidget, QStyledItemDelegate, QLineEdit
from PyQt5.QtGui import QStandardItemModel, QStandardItem, QColor, QFont
from PyQt5.QtCore import Qt

class CustomDelegate(QStyledItemDelegate):
    def paint(self, painter, option, index):
        # 自定义单元格显示样式
        painter.save()

        # 修改背景颜色
        if index.row() % 2 == 0:
            painter.fillRect(option.rect, QColor(220, 220, 220))

        # 获取数据
        value = index.data(Qt.DisplayRole)
        painter.drawText(option.rect, Qt.AlignCenter, value)

        painter.restore()

    def createEditor(self, parent, option, index):
        # 自定义编辑器样式
        editor = QLineEdit(parent)
        editor.setStyleSheet("background-color: yellow; color: blue; font-size: 16px;")
        return editor

    def setEditorData(self, editor, index):
        value = index.data(Qt.EditRole) or index.data(Qt.DisplayRole)
        editor.setText(value)

    def setModelData(self, editor, model, index):
        model.setData(index, editor.text(), Qt.EditRole)

class TableViewDemo(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle('Custom Delegate Example')
        self.setGeometry(100, 100, 800, 600)
        self.createTable()

    def createTable(self):
        # 创建主部件
        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)
        
        # 创建垂直布局
        self.layout = QVBoxLayout()
        self.central_widget.setLayout(self.layout)
        
        # 创建QTableView对象
        self.table_view = QTableView()
        self.layout.addWidget(self.table_view)
        
        # 创建QStandardItemModel对象,指定行数和列数
        self.model = QStandardItemModel(4, 3)
        self.model.setHorizontalHeaderLabels(['Column 1', 'Column 2', 'Column 3'])

        # 填充表格数据
        for row in range(4):
            for column in range(3):
                item = QStandardItem(f'Item {row}, {column}')
                self.model.setItem(row, column, item)

        # 设置模型到表格视图
        self.table_view.setModel(self.model)

        # 使用自定义委托
        delegate = CustomDelegate()
        self.table_view.setItemDelegate(delegate)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = TableViewDemo()
    window.show()
    sys.exit(app.exec_())

运行结果如下:

在这里插入图片描述

6. 实践项目

  • 实际应用项目示例:创建一个简单的学生成绩管理系统,包含添加、编辑、删除和保存数据的功能。

  • 主要功能

    • 显示学生成绩
    • 添加新学生及其成绩
    • 编辑学生成绩
    • 删除学生记录
    • 保存数据到文件
import sys
import csv
from PyQt5.QtWidgets import (
    QApplication, QMainWindow, QTableView, QVBoxLayout, QWidget,
    QPushButton, QLineEdit, QHBoxLayout, QFileDialog, QMessageBox, QStyledItemDelegate
)
from PyQt5.QtGui import QStandardItemModel, QStandardItem, QColor
from PyQt5.QtCore import Qt


class CustomDelegate(QStyledItemDelegate):
    # 自定义委托类,用于自定义单元格的显示和编辑样式
    
    def paint(self, painter, option, index):
        # 自定义单元格的显示
        painter.save()
        
        # 偶数行的背景颜色设置为浅灰色
        if index.row() % 2 == 0:
            painter.fillRect(option.rect, QColor(220, 220, 220))
        
        # 获取数据并居中显示
        value = index.data(Qt.DisplayRole)
        painter.drawText(option.rect, Qt.AlignCenter, value)
        
        painter.restore()

    def createEditor(self, parent, option, index):
        # 创建自定义编辑器
        editor = QLineEdit(parent)
        editor.setStyleSheet("background-color: yellow; color: blue; font-size: 16px;")
        return editor

    def setEditorData(self, editor, index):
        # 将数据从模型设置到编辑器
        value = index.data(Qt.EditRole) or index.data(Qt.DisplayRole)
        editor.setText(value)

    def setModelData(self, editor, model, index):
        # 将数据从编辑器设置回模型
        model.setData(index, editor.text(), Qt.EditRole)


class TableViewDemo(QMainWindow):
    # 主窗口类,包含学生成绩管理系统的主要功能
    
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Student Grade Management System')
        self.setGeometry(100, 100, 1000, 600)
        self.createTable()
        self.createButtons()

    def createTable(self):
        # 创建表格视图和模型
        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)

        self.layout = QVBoxLayout()
        self.central_widget.setLayout(self.layout)

        self.table_view = QTableView()
        self.layout.addWidget(self.table_view)

        # 创建模型,设置列数为4,并设置表头标签
        self.model = QStandardItemModel(0, 4)
        self.model.setHorizontalHeaderLabels(['Name', 'Math', 'Science', 'English'])

        # 将模型设置到表格视图,使用自定义委托,启用排序功能
        self.table_view.setModel(self.model)
        self.table_view.setItemDelegate(CustomDelegate())
        self.table_view.setSortingEnabled(True)

    def createButtons(self):
        # 创建按钮布局和按钮
        button_layout = QHBoxLayout()

        self.add_button = QPushButton('Add Student')
        self.add_button.clicked.connect(self.addStudent)
        button_layout.addWidget(self.add_button)

        self.delete_button = QPushButton('Delete Student')
        self.delete_button.clicked.connect(self.deleteStudent)
        button_layout.addWidget(self.delete_button)

        self.save_button = QPushButton('Save Data')
        self.save_button.clicked.connect(self.saveData)
        button_layout.addWidget(self.save_button)

        self.layout.addLayout(button_layout)

    def addStudent(self):
        # 添加新学生,默认成绩为0
        self.model.appendRow([QStandardItem("New Student"), QStandardItem("0"), QStandardItem("0"), QStandardItem("0")])

    def deleteStudent(self):
        # 删除选定的学生
        selected_indexes = self.table_view.selectionModel().selectedRows()
        if selected_indexes:
            index = selected_indexes[0].row()
            self.model.removeRow(index)

    def saveData(self):
        # 保存数据到CSV文件
        file_path, _ = QFileDialog.getSaveFileName(self, "Save File", "", "CSV Files (*.csv)")
        if file_path:
            try:
                with open(file_path, 'w', newline='') as file:
                    writer = csv.writer(file)
                    
                    # 写入表头
                    headers = [self.model.horizontalHeaderItem(i).text() for i in range(self.model.columnCount())]
                    writer.writerow(headers)

                    # 写入每行数据
                    for row in range(self.model.rowCount()):
                        row_data = [self.model.item(row, col).text() for col in range(self.model.columnCount())]
                        writer.writerow(row_data)

                # 显示成功消息
                QMessageBox.information(self, "Success", "Data saved successfully!")
            except Exception as e:
                # 显示错误消息
                QMessageBox.warning(self, "Error", f"Failed to save data: {e}")


if __name__ == "__main__":
    # 应用程序入口
    app = QApplication(sys.argv)
    window = TableViewDemo()
    window.show()
    sys.exit(app.exec_())

运行结果如下:

在这里插入图片描述

  • 20
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xy_optics

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值