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

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


示例代码

# -*- 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

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值