【PyQt学习篇 · ⑭】:QTableView的使用

文章目录

QTableView的使用

QTableView 是 PyQt 中用于显示表格数据的窗口部件,它提供了一个灵活的方式来显示和编辑数据。下面是一些关于 QTableView 的使用的具体信息:

  1. 创建 QTableView 对象:

    python 复制代码
    from PyQt5.QtWidgets import QApplication, QTableView
    
    app = QApplication([])  # 创建应用程序对象
    tableView = QTableView()  # 创建 QTableView 对象
  2. 设置数据模型:

    QTableView 依赖于数据模型来提供数据。常用的数据模型有 QStandardItemModelQAbstractTableModel。可以根据数据的不同复杂性来选择合适的数据模型。

    python 复制代码
    from PyQt5.QtGui import QStandardItemModel
    
    # 创建数据模型
    model = QStandardItemModel()
    
    # 设置表头
    model.setHorizontalHeaderLabels(["Column 1", "Column 2"])
    
    # 设置数据
    data = [
        ["Row 1, Column 1", "Row 1, Column 2"],
        ["Row 2, Column 1", "Row 2, Column 2"],
        # ...
    ]
    for i, row in enumerate(data):
        for j, value in enumerate(row):
            item = QStandardItem(value)
            model.setItem(i, j, item)
    
    # 将数据模型设置给 QTableView
    tableView.setModel(model)
  3. 显示 QTableView:

    python 复制代码
    tableView.show()
  4. 设置选择模式:

    python 复制代码
    from PyQt5.QtCore import Qt
    
    tableView.setSelectionMode(QTableView.SingleSelection)  # 单选模式
    tableView.setSelectionBehavior(QTableView.SelectRows)  # 选择整行
    tableView.setEditTriggers(QTableView.NoEditTriggers)  # 禁止编辑
  5. 获取选中的数据:

    python 复制代码
    selected_indexes = tableView.selectedIndexes()
    selected_values = []
    for index in selected_indexes:
     	# 判断索引是否有效
        if index.isValid():
            value = index.data()
            selected_values.append(value)
  6. 其他常用操作:

    • 调整列宽:tableView.resizeColumnsToContents()
    • 调整行高:tableView.resizeRowsToContents()
    • 隐藏水平表头:tableView.horizontalHeader().setVisible(False)
    • 设置表格样式:tableView.setStyleSheet("QTableView { background-color: white; }")

示例

python 复制代码
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QStandardItemModel, QStandardItem

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

        self.setWindowTitle("QTableView Example")

        # 创建数据模型
        self.model = QStandardItemModel(4, 3)
        self.model.setHorizontalHeaderLabels(["Name", "Age", "Gender"])

        # 添加数据
        data = [
            ["Alice", "25", "Female"],
            ["Bob", "32", "Male"],
            ["Charlie", "42", "Male"],
            ["Diana", "28", "Female"]
        ]

        for row in range(len(data)):
            for col in range(len(data[row])):
                item = QStandardItem(data[row][col])
                self.model.setItem(row, col, item)

        # 创建 QTableView
        self.table_view = QTableView()
        self.table_view.setModel(self.model)

        # self.table_view.setSelectionBehavior(QTableView.SelectRows)     # 设置 QTableView 控件的选择行为为选择整行(默认为选择单个单元格)
        self.table_view.setContextMenuPolicy(Qt.CustomContextMenu)      # 设置 QTableView 控件的上下文菜单的策略为自定义菜单策略,即用户可以通过customContextMenuRequested信号自定义显示菜单
        self.table_view.customContextMenuRequested.connect(self.show_context_menu)      # 将self.tabel_view控件的 custonContextMenuRequested 信号连接到自定义函数 show_context_menu 上,以便于显示自定义的上下文菜单

        # 设置表头自适应宽度
        self.table_view.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

        # 创建主布局,并将 QTableView 放入其中
        layout = QVBoxLayout()
        layout.addWidget(self.table_view)

        # 创建 QWidget,并将布局设置为其主布局
        central_widget = QWidget()
        central_widget.setLayout(layout)
        self.setCentralWidget(central_widget)

    def show_context_menu(self, position):
        # 右键菜单
        menu = QMenu(self)

        # 删除行
        delete_action = QAction("Delete", self)
        delete_action.triggered.connect(self.delete_selected_row)
        # 添加行
        append_row_action = QAction('Append Row', self)
        append_row_action.triggered.connect(self.append_row)
        # 插入行
        insert_row_action = QAction('Insert Row', self)
        insert_row_action.triggered.connect(self.insert_row)
        # 获取值
        getValue_action = QAction('Get Value', self)
        getValue_action.triggered.connect(self.get_selected_values)

        menu.addActions([delete_action, append_row_action, insert_row_action, getValue_action])

        # 显示菜单
        menu.exec_(self.table_view.viewport().mapToGlobal(position))

    # 删除行
    def delete_selected_row(self):
        # 删除选中的行
        rows = sorted(set(index.row() for index in self.table_view.selectedIndexes()), reverse=True)
        for row in rows:
            self.model.removeRow(row)

    # 添加行
    def append_row(self):
        # 创建空的数据项
        empty_item = QStandardItem()
        self.model.appendRow([empty_item, empty_item, empty_item])

    # 插入行
    def insert_row(self):
        # 创建空的数据项
        empty_item = QStandardItem()
        # 获取当前选中的行
        selected_row = self.table_view.currentIndex().row()
        # 插入空行到选中行下方
        self.model.insertRow(selected_row + 1, [empty_item, empty_item, empty_item])

    def get_selected_values(self):
        selected_row, selected_column = self.table_view.currentIndex().row(), self.table_view.currentIndex().column()
        item = self.model.item(selected_row, selected_column)
        print(item.text())


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

运行结果:

  • 选中"Bob",鼠标点击右键,点击"Delete"。
  • 鼠标右键,点击"Append Row"
  • 鼠标右键,点击"Insert Row"
  • 鼠标右键,点击"Get Value"
相关推荐
青 春 记 忆7 小时前
Dify Docker Compose 通用无损升级指南:从备份、双版本预演到切换与回滚
运维·人工智能·python·docker·容器
GlueNa2SiO37 小时前
03-Flask模板引擎Jinja2详解
笔记·python·flask
临沂GEO9 小时前
GEO搜索优化科普|正规地理位置流量运营入门指南
大数据·人工智能·python·流量运营
大模型码小白9 小时前
Spring AI Tool 实现自然语言操作 MySQL 数据库详解
服务器·开发语言·数据库·人工智能·python·mysql·spring
荷蒲11 小时前
【小白量化Qbuddy】利用AI学习中文Python
人工智能·python·学习
数据狐(Datafox)12 小时前
京东商品列表API技术解析与落地应用(含标准 JSON 示例)
java·大数据·前端·人工智能·python·数据分析·json
量化吞吐机12 小时前
2026年下半年手工交易规则走向量化表达,产品该先接住哪一步
人工智能·python
Metaphor69213 小时前
使用 Python 读取和删除 Excel 文件属性
python·excel
迷迭香yy14 小时前
Python构建转融券多空识别系统从接口到因子的全流程 IG50免费开源股票数据API接口
开发语言·python·开源
月光船幽幽14 小时前
真实即粗糙,光滑是伪造
人工智能·python