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

QTableView的使用

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

  1. 创建 QTableView 对象:

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

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

    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:

    tableView.show()
    
  4. 设置选择模式:

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

    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; }")

示例

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”
    在这里插入图片描述
  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用PyQt5中的QTableView显示MySQL数据库中的数据,可以通过以下步骤实现: 1. 安装PyMySQL模块: ``` pip install PyMySQL ``` 2. 导入PyQt5和PyMySQL模块: ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel import pymysql ``` 3. 创建一个数据库连接: ```python db = QSqlDatabase.addDatabase("QMYSQL") db.setHostName("localhost") # 数据库主机名 db.setPort(3306) # 数据库端口 db.setDatabaseName("test") # 数据库名称 db.setUserName("root") # 数据库用户名 db.setPassword("123456") # 数据库密码 if not db.open(): print("无法连接数据库") sys.exit(-1) ``` 4. 执行SQL查询并将结果显示在QTableView中: ```python model = QSqlTableModel() model.setTable("student") # 表名 model.setEditStrategy(QSqlTableModel.OnManualSubmit) model.select() view = QTableView() view.setModel(model) view.show() ``` 完整代码示例: ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel import pymysql if __name__ == '__main__': app = QApplication(sys.argv) db = QSqlDatabase.addDatabase("QMYSQL") db.setHostName("localhost") # 数据库主机名 db.setPort(3306) # 数据库端口 db.setDatabaseName("test") # 数据库名称 db.setUserName("root") # 数据库用户名 db.setPassword("123456") # 数据库密码 if not db.open(): print("无法连接数据库") sys.exit(-1) model = QSqlTableModel() model.setTable("student") # 表名 model.setEditStrategy(QSqlTableModel.OnManualSubmit) model.select() view = QTableView() view.setModel(model) view.show() sys.exit(app.exec_()) ``` 注意:该代码只是简单地演示了如何使用PyQt5和PyMySQL连接数据库,并将数据显示在QTableView中。在实际应用中,需要根据具体需求进行相应的修改和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

街 三 仔

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

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

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

打赏作者

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

抵扣说明:

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

余额充值