Pyside6 TableView 显示按钮 - QStyledItemDelegate 简单实现

2023-11-12

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


示例代码

# -*- coding:utf-8 -*-
import sys
from PySide6.QtCore import *
from PySide6.QtGui import *
from PySide6.QtWidgets import *

class DelegateButton( QStyledItemDelegate ) :
    onClick = Signal( int, int )
    def __init__( self, parent=None ) :
        super().__init__(parent)
        self._mybtn = None
        self._pressed = None
        self._rfbutton = QPushButton()

    # 关闭编辑功能
    # 可以通过返回QWidget实现自定义的编辑器,同时可能需要实现以下方法:
    # setEditorData( self, editor, index )
    # setModelData( self, editor, model, index )
    # updateEditorGeometry(self, editor, option, index )
    def createEditor( self, parent, option, index ) :
        return None

    # 自定义绘制
    def paint( self, painter, option, index ) :
        self._mybtn = self._mybtn or QStyleOptionButton()
        
        if index.row() % 2 == 0 :
            # 修改偶数行的按钮大小
            top_span_height = (option.rect.height() - 24)/2
            pos_x = 8 + option.rect.x()
            pos_y = option.rect.y() + top_span_height

            self._mybtn.rect = QRect(pos_x, pos_y, 24, 24)
            self._mybtn.text = str(index.row())

        else :
            # 让奇数行的按钮占满整个option(单元格)对应的区域
            self._mybtn.rect = option.rect
            data= index.model().data(index)
            self._mybtn.text = str(data)

        # 如果点击的位置在self._myBtn的区域,修改按钮状态
        if self._pressed and self._mybtn.rect.contains(self._pressed) :
            # 触发信号
            self.onClick.emit(index.row(), index.column())
            # 修改按钮状态
            self._mybtn.state = QStyle.State_Enabled | QStyle.State_Sunken
        else:
            self._mybtn.state = QStyle.State_Enabled

        # 绘制按钮
        self._rfbutton.style().drawControl(QStyle.CE_PushButton, self._mybtn, painter, self._rfbutton)

    # 处理鼠标事件
    def editorEvent( self, event, model, option, index ) :
        if event.type() == QEvent.MouseButtonPress :
            # 如果点击的位置在option的区域,记录点击的位置
            pos = event.position()
            if option.rect.contains(pos.x(), pos.y()) :
                self._pressed = QPoint(pos.x(), pos.y())
            return True
        if event.type() == QEvent.MouseButtonRelease :
            # 鼠标点击完成后重置点击位置为None
            self._pressed = None
            return True
        return False



if __name__ == '__main__' :

    app = QApplication(sys.argv)
    rows = 5
    cols = 2

    model = QStandardItemModel(rows, cols)
    tableView = QTableView()
    tableView.setWindowTitle("Delegate Issue")
    tableView.setModel(model)

    delegate = DelegateButton()
    delegate.onClick.connect(lambda a, b : print('onClick, row:%d, column:%d'%(a, b)))

    tableView.setItemDelegateForColumn(1, delegate)
    tableView.setColumnWidth(0, 200)
    tableView.setColumnWidth(1, 200)
    tableView.verticalHeader().setDefaultSectionSize(32)
    tableView.setSelectionBehavior(QAbstractItemView.SelectRows)

 
    for row in range(rows) :
        index = model.index(row, 0)
        model.setData(index, row if row % 2 == 0 else 'info: %d'%row)
        index = model.index(row, 1)
        model.setData(index, {'data': row})

    tableView.show()
    tableView.resize(450,300)

    sys.exit(app.exec())

效果图

示例效果

参考链接

QStyledItemDelegate
PySide: QStyledItemDelegate button’s stylesheet Issue

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pyside6 TableView 显示按钮 - QStyledItemDelegate 简单实现 的相关文章

  • Django - 未找到“”的反向。 '' 不是有效的视图函数或模式名称

    我正在研究我的课程项目 但现在我完全陷入困境 我正在创建一个网站通过 PayPal 销售产品 但 PayPal 退货 取消页面未正确呈现 我已经按照课程中的示例检查了代码一百次 但显然我遗漏了一些东西 当我转到产品 单击 立即购买 登录 P
  • 使用 python 将 bibtex 文件转换为 html (也许是 pybtex?)

    您好 我想解析 bibtex 出版物文件并对特定字段 例如年份 进行排序并过滤某些内容 然后将其放在网站上 我遇到了 pybtex 它可以读取和解析 bibtex 文件 但它基本上没有记录 我不知道如何对条目进行排序 pybtex 是可行的
  • 为什么 takewhile() 会跳过第一行?

    我有一个这样的文件 1 2 3 TAB 1 2 3 TAB 我想将 TAB 之间的行作为块读取 import itertools def block generator file with open file as lines for li
  • Flask-admin 内联建模传递表单参数会抛出 AttributeError

    Flask 开发者们大家好 在 Flask admin 中 我目前尝试在模型视图中实现内联模型编辑 在模型方面 我有一个简单的树结构 表示一组内容页面 每个节点都有多个子节点以及与其关联的多个内容数据模型 模型被命名为ContentNode
  • lxml/python 使用 CDATA 部分读取 xml

    在我的 xml 中我有一个CDATA部分 我想保留 CDATA 部分 然后剥离它 有人可以帮忙解决以下问题吗 默认不起作用 from io import StringIO from lxml import etree xml
  • 是否可以使用 csv.DictReader 保持列顺序?

    例如 我的 csv 有如下列 ID ID2 Date Job No Code 我需要以相同的顺序写回各列 这dict立即打乱了顺序 所以我相信这更多是读者的问题 蟒蛇的dicts 在 3 6 之前不维持顺序 但是 无论如何 在该版本中csv
  • 解码来自 S60 设备的 WBXML SyncML 消息

    我正在尝试解码来自诺基亚 N95 的 WBXML 编码的 SyncML 消息 我的第一次尝试是使用 python pywbxml 模块 它包装了对 libwbxml 的调用 用此方法解码消息会得到许多 标签以及 标签内的一大块二进制文件 我
  • 使用 isdigit 表示浮点数?

    a raw input How much is 1 share in that company while not a isdigit print You need to write a number n a raw input How m
  • python-messaging 无法处理 HTTP 请求

    我正在使用下面的代码尝试使用 python messaging 发送彩信https github com pmarti python messaging blob master doc tutorial mms rst https gith
  • 使用Python处理Sqlite数据库中的换行符“\n”?

    我有一个名为 test db 的 Sqlite 数据库 其中包含两个表 其结构如下 表 1 ID 整数主键自动增量 名称 varchar 500 颜色 varchar 500 表2 ID INTEGER PRIMARY KEY AUTOIN
  • Groupby Sum 忽略几列

    在此数据框中 我想按 位置 进行分组并获得 分数 的总和 但我不希望 纬度 经度 和 年份 在此过程中受到影响 sample pd DataFrame Location A B C A B C Year 2001 2002 2003 200
  • 与 GridSearchCV 的并行错误,与其他方法一起工作正常

    我使用 GridSearchCV 时遇到以下问题 它在使用时给我一个并行错误n jobs gt 1 同时n jobs gt 1与 RadonmForestClassifier 等单一模型配合良好 下面是一个显示错误的简单工作示例 train
  • 使用 selenium 和 firefox 保存图像

    我正在尝试使用 selenium 服务器和 python 客户端从网站保存图像 我知道图像的 URL 但我无法找到保存它的代码 无论是当它是文档本身还是当它嵌入到当前浏览器会话中时 到目前为止我找到的解决方法是保存页面的屏幕截图 有两种硒方
  • CTRL-C 在 Python 中的行为有所不同

    I ve recently started learning Python long time Java programmer here and currently in the process of writing some simple
  • 如何将 MP3 音频文件读入 numpy 数组/将 numpy 数组保存到 MP3?

    有没有办法从 MP3 音频文件中读取 写入 MP3 音频文件numpy具有类似 API 的数组scipy io wavfile read https docs scipy org doc scipy 0 14 0 reference gen
  • 在keras自定义损失中使用层输出

    我正在 Keras 中开发自定义损失函数 我需要第一层输出 我怎样才能取回它 def custom loss y true y pred cross K mean K binary crossentropy y true y pred ax
  • Django ImageField 默认值

    模型 py class UserProfile models Model photo models ImageField upload to get upload file name storage OverwriteStorage def
  • python webdriver_manager chrome 自定义配置文件

    如何使 webdriver manager chrome 使用自定义 chrome 用户配置文件 我知道对于 selenium webdriver 我可以这样指定 options Options options add argument f
  • python 根据日期创建目录结构

    我使用以下函数根据今天的日期创建目录 usr bin python import time datetime os today datetime date today todaystr today isoformat os mkdir to
  • Django 多个外键,相同的相关名称

    我想创建一个模型 1 其中具有相同其他模型 2 的多个外键 我希望这些外键具有相同的related name因为每个外键将指向 model 2 的不同实例 因为我需要所有外键的一个反向关系 也许一个例子会更明确 class Parent M

随机推荐

  • 使用腾讯云clb实现https转发

    腾讯云clb实现https进行转发 七层反代 四层负载均衡和七层负载均衡有什么区别 四层均衡能力 是基于 IP 端口的负载均衡 七层是基于应用层信息 如 HTTP 头部 URL 等 的负载均衡 四到七层负载均衡 就是在对后台的服务器进行负载
  • SpringBoot读取配置文件的两种方式以及自定义配置文件的读取

    1 读取默认配置文件中的数据 application properties 直接使用 Value注解获取数据 2 使用Environment获取数据 防止乱码统一编码格式 注入Environment 使用getProperty获取数据 3
  • UE4 Actor生命周期 SpawnActor DestroyActor剖析

    原创文章 转载请注明出处 AActor很重要 只要是我们世界大纲列表内的物体 全部都是AActor 目录 第一部分 从编辑器点击Play开始分析World里面全部的Actor的Spawn流程 分析到调用BeginPlay结束 1 gt 下面
  • Effective java 总结10-并发

    Effective java 总结10 并发 第78条 同步访问共享的可变数据 Synchronized 可以保证在同一时刻 只有一个线程可以执行某一个方法 或者某一个代码块 同步可以阻止一个线程看到对象处于不一致的状态中 还可以保证进入同
  • mysql 5.7的jdbc驱动_高版本MySQL(5.7,5.8)的JDBC连接新问题

    在使用JDBC连接访问MySQL时一般要使用对应版本的驱动 比如我使用了8 0 11版本的MySQL 对应驱动的Maven描述为 1 2 mysql 3 mysql connector java 4 8 0 11 5 然后遇到了驱动问题 S
  • Python 自动化处理 Yaml 文件

    1 Yaml 是什么 Yaml是一种简洁的非标记语言 Yaml是一个可读性高 用来表达数据序列化的格式 Yaml以数据为中心 使用空白 缩进 分行组织数据 从而使得表示更加简洁 Yaml特别适合用来表达或编辑数据结构 各种配置文件 文件大纲
  • Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted

    一般为数组越界 查看一下数组大小
  • 算力军备竞赛白热化 “卖铲人”联想集团竞争力如何?

    继微软通过OpenAI推出GPT系列 谷歌推出Bard和PaLM E2之后 国内AI大模型也呈百家争鸣态势 年初至今 国内科技巨头几乎都发布了自研AI大模型产品 AI竞赛全面升级的背后 是全球科技巨头们对算力的争夺 作为算力载体的AI服务器
  • 使用Docker+Jenkins+Gitee自动化部署SpringBoot项目

    目录 搭建基础环境 1 使用Docker Compose搭建基础环境 2 搭建项目仓库环境 创建Dockerfile文件 2022 12 15更新 3 配置Jenkins 3 1 初始化Jenkins 3 2 安装核心插件 3 3 全局工具
  • 学习笔记1——常用的注意力机制(即插即用)

    在目标检测网络里加注意力机制已经是很常见的了 顾名思义 注意力机制是指在全局图像中获得重点关注的目标 常用的注意力机制有SE CA ECA CBAM GAM NAM等 1 SE模块 论文 https arxiv org pdf 1709 0
  • 【论文阅读】LASOR: Learning Accurate 3D Human Pose and Shape Via Synthetic Occlusion-Aware Data and Neural

    1 环境配置上 1 1 报错 1 1 1 opencv cv2 error OpenCV 4 6 0 error 5 Bad argument in function circle Overload resolution failed Ca
  • Flutter层叠布局 Stack、Positioned

    Flutter中使用Stack和Positioned这两个组件来配合实现绝对定位 Stack允许子组件堆叠 而Positioned用于根据Stack的四个角来确定子组件的位置 Stack alignment 此参数决定如何去对齐没有定位 没
  • FiddlerCore HTTPS 证书每次都需要创建的问题

    FiddlerCore HTTPS 证书每次都需要创建的问题 问题描述 我使用FiddlerCore来抓取HTTPS数据 需要安装证书 使用以下代码进行安装 安装证书 public static bool InstallCertificat
  • python读取mongoDb数据库保存到Excel CSV中

    import xlwt import pymongo import pandas as pd import xlsxwriter as xw 连接mongodb数据库 client pymongo MongoClient localhost
  • 防火墙安全策略&&防火墙安全区域的划分

    给两台PC任意设置两个网段 并划分好trust和untrust区域 利用默认账号密码登录 账号 admin密码 Admin 123 然后自行随意修改密码 给防火墙的两个接口配上对应地址并放行 两个接口进行同样的操作 这个时候还是不能够通信
  • API接口设计规范

    说明 在实际的业务中 难免会跟第三方系统进行数据的交互与传递 那么如何保证数据在传输过程中的安全呢 防窃取 除了https的协议之外 能不能加上通用的一套算法以及规范来保证传输的安全性呢 下面我们就来讨论下常用的一些API设计的安全方法 可
  • taro-vue3监听左滑/右滑手势退出

    一 业务背景 我做的是一个要货小程序 没有华丽的页面 没有购物车 就是在要货页面填写要货数量 然后跳转到预览页面 预览页面有保存和支付按钮 可以先点保存 再点支付 也可以直接点支付 支付的同时进行保存 问题 支付成功后直接跳转回菜单页面 但
  • pytorch利用resnet50实现cifar10准确率到95%以上

    目录 前言 代码 前言 因为课程需要 老师要求使用resnet18或者resnet50将cifar10训练到精度到达95 试过了网上其他很多方法 发现精度最高的是在预处理化的时候 图片resize到32 32 并且padding 4进行填充
  • elasticsearch 版本 2xx和5xx 及 elasticsearch5.x 新特性

    其实 elasticsearch5 x 和 elasticsearch2 x 并不区别很大 是因为 ELK里之前版本各种很混乱 直接升级到5 0了 其实 elasticsearch5 x 按理来说是elasticsearch3 x 只是为了
  • Pyside6 TableView 显示按钮 - QStyledItemDelegate 简单实现

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 目录 示例代码 效果图 参考链接 示例代码 coding utf 8 import sys from PySide6 QtCore import from PySide6 Q