【Python-GUI】pyside2/pyqt5表格复选框、全选框、删除多行

前言

  1. 本文实现表格的复选、全选、删除多行、指定列不可编辑、指定列颜色。

  2. 表头全选按钮感谢文章分享:https://blog.csdn.net/weixin_44429308/article/details/106093685
    注:水平有限文中部分代码没看懂,直接拿过来套用了,惭愧惭愧~~~~

话不多说,直接上效果图:
在这里插入图片描述

一、QT设计大师构建界面,创建文件qtable_delete.ui

在这里插入图片描述

二、代码部分:

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

all_header_checkbox =[]

#设置列不可编辑类
class EmptyDelegate(QItemDelegate):
    def __init__(self,parent):
        super(EmptyDelegate, self).__init__(parent)
    def createEditor(self, QWidget, QStyleOptionViewItem, QModelIndex):
        return None
#表格类
class qtableDelete():
    def __init__(self):
        self.ui = QUiLoader().load('ui/qtable_delete.ui')
        self.settable()
        self.ui.delete_2.clicked.connect(self.delete_check)
        
	#设置表格内容
    def settable(self):
        header = CheckBoxHeader()
        self.ui.table.setHorizontalHeader(header) # 设置头复选框
        header.select_all_clicked.connect(header.change_state)  # 行表头复选框单击信号与槽
        self.ui.table.setSelectionBehavior(QAbstractItemView.SelectRows)  # 设置整行选中
        # self.ui.table.setSelectionMode(QAbstractItemView.SingleSelection)#设置选择模式,选择单行
        self.ui.table.setRowCount(15)  # 设置表格行数
        self.ui.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)  # 设置表头自适应
        #设置表格内容和复选框
        for i in range(15):
            checkbox = QCheckBox()
            all_header_checkbox.append(checkbox)
            # checkbox.setCheckState(Qt.Unchecked) #设置复选框为不选状态、Partially(半选)、Checked(全选)
            self.ui.table.setCellWidget(i, 0, checkbox)  # 设置表格可选项
            for j in range(5):
                self.ui.table.setItem(i, j, QTableWidgetItem(f'{i}row,{j}col'))

                self.ui.table.item(i, j).setTextAlignment(Qt.AlignCenter | Qt.AlignVCenter)  # 设置表格内水平垂直居#设置指定列的颜色和下划线
		#设置第4列样式
        for i in range(self.ui.table.rowCount()):
            self.ui.table.item(i, 3).setForeground(QBrush(QColor('Blue'))) #设置颜色
            font = QFont()
            font.setUnderline(True)
            self.ui.table.item(i, 3).setFont(font)#设置下划线

        #设置第1/2/3、5列不可编辑
        list = [1, 2, 0, 4]
        for i in list:
            self.ui.table.setItemDelegateForColumn(i, EmptyDelegate(self.ui))

#删除选中的行数
    def delete_check(self):
        row_box_list = []
        # 获取选中数据
        for i in range(self.ui.table.rowCount()):
            if self.ui.table.cellWidget(i, 0).isChecked() is True:
                row_box_list.append(i)
                row_box_list.reverse()  # 将数据进行降序
        for j in row_box_list:
            self.ui.table.removeRow(j)  # 删除选中行数据
            all_header_checkbox.pop(j)  # 重新构建check box列表

class CheckBoxHeader(QHeaderView):
    """自定义表头类"""
    # 自定义 复选框全选信号
    select_all_clicked = Signal(bool)
    # 这4个变量控制列头复选框的样式,位置以及大小
    _x_offset = 0
    _y_offset = 0
    _width = 20
    _height = 20

    def __init__(self, orientation=Qt.Horizontal, parent=None):
        super(CheckBoxHeader, self).__init__(orientation, parent)
        self.isOn = False

    def paintSection(self, painter, rect, logicalIndex):
        painter.save()
        super(CheckBoxHeader, self).paintSection(painter, rect, logicalIndex)
        painter.restore()

        self._y_offset = int((rect.height() - self._width) / 2.)

        if logicalIndex == 0:
            option = QStyleOptionButton()
            option.rect = QRect(rect.x() + self._x_offset, rect.y() + self._y_offset, self._width, self._height)
            option.state = QStyle.State_Enabled | QStyle.State_Active
            if self.isOn:
                option.state |= QStyle.State_On
            else:
                option.state |= QStyle.State_Off
            self.style().drawControl(QStyle.CE_CheckBox, option, painter)

    def mousePressEvent(self, event):
        index = self.logicalIndexAt(event.pos())
        if 0 == index:
            x = self.sectionPosition(index)
            if x + self._x_offset < event.pos().x() < x + self._x_offset + self._width and self._y_offset < event.pos().y() < self._y_offset + self._height:
                if self.isOn:
                    self.isOn = False
                else:
                    self.isOn = True
                    # 当用户点击了行表头复选框,发射 自定义信号 select_all_clicked()
                self.select_all_clicked.emit(self.isOn)

                self.updateSection(0)
        super(CheckBoxHeader, self).mousePressEvent(event)

    # 自定义信号 select_all_clicked 的槽方法
    def change_state(self, isOn):
        # 如果行表头复选框为勾选状态
        if isOn:
            # 将所有的复选框都设为勾选状态
            for i in all_header_checkbox:
                i.setCheckState(Qt.Checked)
        else:
            for i in all_header_checkbox:
                i.setCheckState(Qt.Unchecked)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    stats = qtableDelete()
    stats.ui.show()
    app.exec_()

  • 6
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 25
    评论
Pyside6和PyQt6都是Python编程语言中用于创建GUI应用程序的工具包。它们都是基于Qt架构建的,因此具有相似的功能和API。 以下是关于使用Pyside6/PyQt6进行快速开发和实战的一些提示: 1. 学习Qt架:Qt架是创建GUI应用程序的基础。学习Qt架可以帮助你了解Pyside6和PyQt6的工作原理,以及如何使用它们创建GUI应用程序。 2. 学习Python编程语言:Pyside6和PyQt6都是Python编程语言的库。因此,熟悉Python编程语言可以帮助你更好地使用这些库。 3. 使用Qt Designer:Qt Designer是一个可视化工具,可以帮助你轻松创建GUI应用程序的UI。你可以使用Qt Designer创建UI,并将其导入到Pyside6/PyQt6项目中。 4. 学习信号和槽:信号和槽是Pyside6/PyQt6中的重要概念。信号是一个事件,例如按钮单击或文本更改,而槽是响应这些事件的函数。学习如何使用信号和槽可以帮助你创建响应用户操作的GUI应用程序。 5. 阅读文档和示例代码:Pyside6和PyQt6都有详细的文档和示例代码。阅读这些文档和示例代码可以帮助你了解如何使用库中的不同功能和API,并为你的项目提供灵感。 6. 加入社区:Pyside6和PyQt6有活跃的社区和论坛。加入这些社区可以帮助你与其他开发人员交流经验,并得到解决问题的帮助。 总之,使用Pyside6和PyQt6进行快速开发和实战需要学习Qt架、Python编程语言、Qt Designer、信号和槽等知识,并阅读文档和示例代码。加入社区可以帮助你更好地了解和使用这些库。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值