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

news2024/11/17 0:17:46

文章目录

  • 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”
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1339041.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络基础:OSI参考模型是什么?

一、概述 OSI (Open Systems Interconnection Model,开放式系统互联模型),由ISO ( International Organization for Standardization,国际标准化组织 ) 收录在ISO 7489标准中并于1984年发布。 意义: 在OSI没有出来之前我们的网络有如下问题…

Linux Debian12使用podman安装upload-labs靶场环境

一、upload-labs简介 PHP语言编写,持续收集渗透测试和CTF中针对文件上传漏洞的靶场,总共21关,每一关都包含着不同的上传绕过方式。 二、安装podman环境 Linux Debian系统如果没有安装podman容器环境,可以参考这篇文章先安装pod…

如何在vscode当中预览html文件运行结果

如何在vscode当中预览html文件运行结果 下载拓展内容打开拓展界面下载拓展 运行html文件参考内容 上一篇文章当中讲了如何实现在网页上对html文件的预览,但是这样子其实在运行代码的过程当中效果比较差,那么还需要可以实时预览运行的结果 下载拓展内容 打开拓展界面 下载拓展 …

微信小程序发放红包封面及领取

微信小程序发放红包封面及领取 一、微信红包封面开放平台配置发放的红包封面二、小程序后管平台设置配置录入红包封面奖品信息三、微信小程序调用接口效果 一、微信红包封面开放平台配置发放的红包封面 微信红包封面开放平台 红包封面的发放方式有:领取二维码、领…

unity 保存和加载窗口布局

这么简单的事网上一堆废话文章 右上角,Layout点开后有保存和删除 要切换布局点红框里的已经保存的布局

Linux下MQTT环境的简单应用及搭建——之Mosquitto

文章目录 前言一、ubuntu搭建mqtt服务器 | 概要二、整体架构流程 | 技术实现细节1、下载源码2、安装Mosquitto3、解压并修改配置文件4、关于Mosquitto常见的一些操作指令5、启动mosquitto6、测试mosquitto测试1:Linux多终端交互测试测试2:Linux与Windows…

2023安洵杯-秦岭防御军wp

reverse 感觉有点点简单## import base64 def ba64_decode(str1_1):mapp "4KBbSzwWClkZ2gsr1qAQu0FtxOm6/iVcJHPY9GNp7EaRoDf8UvIjnL5MydTX3eh"data_1 [0] * 4flag_1 [0] * 3for i in range(32, 127):for y in range(32, 127):for k in range(32, 127):flag_1[0]…

MIT线性代数笔记-第30讲-奇异值分解

目录 30.奇异值分解打赏 30.奇异值分解 奇异值分解(简称 S V D SVD SVD分解)可以将一个比较复杂的矩阵用更小更简单的几个子矩阵相乘来表示,这些小矩阵描述的都是矩阵的重要的特性。奇异值分解在图形降噪、推荐系统中都有很重要的应用。 对…

最优化考试之牛顿法

最优化考试之牛顿法 一、牛顿法1.问题条件2.求解过程3.例子 PS 一、牛顿法 1.问题条件 目标函数 f ( x ) f(x) f(x),求极小值初始点 x 0 x_0 x0​精度要求e(没有提就是近似0) 2.求解过程 求解一阶雅克比矩阵 ∇ f ( x ) ∇f(x) ∇f(x)和二…

分享11 种有用的 JavaScript 技巧

今天这篇文章,我想与你分享 11个有用的JavaScript实用小技巧,它们将极大地提高你的工作效率。 1.生成随机颜色的两种方式 1).生成RandomHexColor const generateRandomHexColor () > {return #${Math.floor(Math.random() * 0xffffff)…

Java多线程的概念以及三种实现方式(Thread类,Callable接口,Runnable接口)

目录 1.线程2.多线程的应用场景3.并发和并行4.多线程的实现方式1.继承Thread类的方式进行实现2.实现**Runnable接口**的方式进行实现3.利用Callable接口和Future接口方式实现 4.多线程几种实现方式之间的对比 1.线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程…

Jmeter之JSON断言

需求 我们发送一个请求&#xff0c;结果返回json数据&#xff0c;我们需要根据json数据中code的值来判断此次请求是否成功。 接口案例&#xff1a; PostMapping(value "/login") public ResponseMessage<String> login(RequestBody SeckillUserDTO seckill…

LeetCode-移除元素(27) 合并两个有序数组(88)

1.移除元素&#xff08;27&#xff09; 题目描述&#xff1a; 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入…

Session的使用详解(创建,获取和销毁)

文章目录 Session的使用详解&#xff08;创建&#xff0c;获取和销毁&#xff09;1、为什么使用session,与cookie的区别2、session是什么3、session的常用方法4、session的构造和获取代码演示SetSessionServlet.javaGetSessionServlet.javaweb.xml运行结果如下: 5、销毁session…

跨境电商营销工具:功能详解与实战应用!

在当今全球化的电商市场中&#xff0c;跨境电商营销工具已经成为企业不可或缺的营销利器。 这些工具为企业提供了丰富的功能&#xff0c;帮助企业更好地拓展海外市场、提升品牌影响力&#xff0c;本文将为您详细解读跨境电商营销工具的一般功能&#xff0c;以及如何在实际操作…

【JavaScript】垃圾回收与内存泄漏

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

HPM6750开发笔记《开发环境的搭建》

目录 一&#xff0c;下载完整的HPM—SDK 二&#xff0c;安装硬件驱动 二&#xff0c;软件激活 三&#xff0c;创建工程 1.用文档中给的方法创建工程&#xff1a; 2.用sdk_env_v1.3.0中提供的工具创建工程&#xff1a; 一&#xff0c;下载完整的HPM—SDK 下载网址&#x…

ElasticSearch 搜索数据

精确查询 存在查询 Exists query 用于查询某个字段不为空的数据。如下所示&#xff0c;查询 age 不为空的 数据 POST user/_search {"query": {"exists": {"field": "age"}} }主键查询 通过 _id 字段查询数据 POST user/_search …

【深度学习-目标检测】05 - YOLOv1 论文学习与总结

论文地址&#xff1a;You Only Look Once:Unified, Real-Time Object Detection 论文学习 1. 摘要 YOLO的提出&#xff1a;作者提出了YOLO&#xff0c;这是一种新的目标检测方法。与传统的目标检测方法不同&#xff0c;YOLO将目标检测视为一个回归问题&#xff0c;直接从图像…

搭建FTP服务器详细介绍

一.FTP简介 &#xff11;.&#xff11;什么是FTP &#xff11;.&#xff12;FTP服务器介绍 &#xff11;.&#xff13;FTP服务器优缺点 二.FTP服务器的搭建与配置 2.1 开启防火墙 2.2创建组 2.3创建用户 2.4安装FTP服务器 2.5配置FTP服务器 &#xff12;.&#xff…