QTableView复选框

article/2025/10/23 9:34:32

QTableView复选框,支持未选中、部分选中、全选三种状态

参考博文(若有侵权,联系删除)

  1. https://blog.csdn.net/liang19890820/article/details/50718340
  2. https://blog.csdn.net/qq_44257811/article/details/120266599

效果图(未选中)

在这里插入图片描述

效果图(全选)

效果图(部分选中)

在这里插入图片描述

核心代码


/* tablemodel.h* QTableView 添加复选框* 参考:https://blog.csdn.net/liang19890820/article/details/50718340
*/#ifndef TABLEMODEL_H
#define TABLEMODEL_H#include <QObject>
#include <QAbstractTableModel>class FileRecord
{
public:bool bChecked;QString strFilePath;
};class TableModel : public QAbstractTableModel
{Q_OBJECT
public:TableModel(QObject *parent);~TableModel();public:QList<FileRecord> m_recordList;void updateData(QList<FileRecord> recordList);int rowCount(const QModelIndex &parent) const;int columnCount(const QModelIndex &parent) const;bool setData(const QModelIndex &index, const QVariant &value, int role);QVariant data(const QModelIndex &index, int role) const;QVariant headerData(int section, Qt::Orientation orientation, int role) const;Qt::ItemFlags flags(const QModelIndex &index) const;void onStateChanged();//更新表头复选框状态
public slots:void onStateChanged(int state);//根据表头选中状态更新数据选中状态
signals:void stateChanged(int);//复选框被点击发送信号
};#endif // TABLEMODEL_H
//tablemodel.cpp#include "tablemodel.h"#define CHECK_BOX_COLUMN 0
#define File_PATH_COLUMN 1TableModel::TableModel(QObject *parent): QAbstractTableModel(parent)
{}TableModel::~TableModel()
{}// 更新表格数据
void TableModel::updateData(QList<FileRecord> recordList)
{m_recordList = recordList;beginResetModel();endResetModel();
}// 行数
int TableModel::rowCount(const QModelIndex &parent) const
{return m_recordList.count();
}// 列数
int TableModel::columnCount(const QModelIndex &parent) const
{return 2;
}// 设置表格项数据
bool TableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{if (!index.isValid())return false;int nColumn = index.column();FileRecord record = m_recordList.at(index.row());switch (role){case Qt::DisplayRole:{if (nColumn == File_PATH_COLUMN){record.strFilePath = value.toString();m_recordList.replace(index.row(), record);emit dataChanged(index, index);return true;}}case Qt::CheckStateRole:{if (nColumn == CHECK_BOX_COLUMN){record.bChecked = (value.toInt() == Qt::Checked);m_recordList.replace(index.row(), record);emit dataChanged(index, index);emit onStateChanged();return true;}}default:return false;}return false;
}// 表格项数据
QVariant TableModel::data(const QModelIndex &index, int role) const
{if (!index.isValid())return QVariant();int nRow = index.row();int nColumn = index.column();FileRecord record = m_recordList.at(nRow);switch (role){case Qt::TextColorRole:return QColor(Qt::white);case Qt::TextAlignmentRole:return QVariant(Qt::AlignCenter | Qt::AlignVCenter);// 表格数据内容位置case Qt::DisplayRole:{if (nColumn == File_PATH_COLUMN)return record.strFilePath;return "";}case Qt::CheckStateRole:{if (nColumn == CHECK_BOX_COLUMN)return record.bChecked ? Qt::Checked : Qt::Unchecked;}default:return QVariant();}return QVariant();
}// 表头数据
QVariant TableModel::headerData(int section, Qt::Orientation orientation, int role) const
{switch (role){case Qt::TextAlignmentRole:return QVariant(Qt::AlignCenter | Qt::AlignVCenter);// 表头内容位置case Qt::DisplayRole:{if (orientation == Qt::Horizontal){if (section == CHECK_BOX_COLUMN)return QStringLiteral("全选");if (section == File_PATH_COLUMN)return QStringLiteral("文件路径");}}default:return QVariant();}return QVariant();
}// 表格可选中、可复选
Qt::ItemFlags TableModel::flags(const QModelIndex &index) const
{if (!index.isValid())return QAbstractItemModel::flags(index);Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;if (index.column() == CHECK_BOX_COLUMN)flags |= Qt::ItemIsUserCheckable;return flags;
}void TableModel::onStateChanged()
{int checked = 0, unchecked = 0;foreach (FileRecord fr, m_recordList) {if(fr.bChecked)checked++;elseunchecked++;}if(checked == m_recordList.count())emit stateChanged(Qt::Checked);else if(unchecked == m_recordList.count())emit stateChanged(Qt::Unchecked);elseemit stateChanged(Qt::PartiallyChecked);
}void TableModel::onStateChanged(int state)
{state==Qt::Checked?Qt::Checked:Qt::Unchecked;//判断全选是选中还是未选中QModelIndex index;for (int i = 0; i < m_recordList.count(); ++i){index = this->index(i, 0);setData(index,state, Qt::CheckStateRole);//使用自己重写的setData更新状态}
}
// tableheaderview.h#ifndef TABLEHEADERVIEW_H
#define TABLEHEADERVIEW_H#include <QObject>
#include <QHeaderView>class TableHeaderView:public QHeaderView
{Q_OBJECT
public:TableHeaderView(Qt::Orientation orientation, QWidget *parent);~TableHeaderView();public:void paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const;bool event(QEvent *e) Q_DECL_OVERRIDE;void mousePressEvent(QMouseEvent *e) Q_DECL_OVERRIDE;void mouseReleaseEvent(QMouseEvent *e) Q_DECL_OVERRIDE;
public slots:void onStateChanged(int state);
signals:void stateChanged(int);public:bool m_bPressed;bool m_bChecked;bool m_bTristate;bool m_bNoChange;bool m_bMoving;
};#endif // TABLEHEADERVIEW_H
//tableheaderview.cpp#include "tableheaderview.h"
#include <QCheckBox>#define CHECK_BOX_COLUMN 0
#define File_PATH_COLUMN 1TableHeaderView::TableHeaderView(Qt::Orientation orientation, QWidget *parent): QHeaderView(orientation, parent),m_bPressed(false),m_bChecked(false),m_bTristate(false),m_bNoChange(false),m_bMoving(false)
{setSectionsClickable(true);
}TableHeaderView::~TableHeaderView()
{}// 槽函数,用于更新复选框状态
void TableHeaderView::onStateChanged(int state)
{if (state == Qt::PartiallyChecked){m_bTristate = true;m_bNoChange = true;}else{m_bNoChange = false;}m_bChecked = (state != Qt::Unchecked);update();
}// 绘制复选框
void TableHeaderView::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const
{painter->save();QHeaderView::paintSection(painter, rect, logicalIndex);painter->restore();if (logicalIndex == CHECK_BOX_COLUMN){QStyleOptionButton option;option.initFrom(this);if (m_bChecked)option.state |= QStyle::State_Sunken;if (m_bTristate && m_bNoChange)option.state |= QStyle::State_NoChange;elseoption.state |= m_bChecked ? QStyle::State_On : QStyle::State_Off;if (testAttribute(Qt::WA_Hover) && underMouse()) {if (m_bMoving)option.state |= QStyle::State_MouseOver;elseoption.state &= ~QStyle::State_MouseOver;}QCheckBox checkBox;option.rect = QRect(4,5,15,15);//绘制复选框的位置与大小style()->drawPrimitive(QStyle::PE_IndicatorCheckBox, &option, painter, &checkBox);}
}// 鼠标按下表头
void TableHeaderView::mousePressEvent(QMouseEvent *event)
{int nColumn = logicalIndexAt(event->pos());if ((event->buttons() & Qt::LeftButton) && (nColumn == CHECK_BOX_COLUMN)){m_bPressed = true;}else{QHeaderView::mousePressEvent(event);}
}// 鼠标从表头释放,发送信号,更新model数据
void TableHeaderView::mouseReleaseEvent(QMouseEvent *event)
{if (m_bPressed){if (m_bTristate && m_bNoChange){m_bChecked = true;m_bNoChange = false;}else{m_bChecked = !m_bChecked;}update();Qt::CheckState state = m_bChecked ? Qt::Checked : Qt::Unchecked;emit stateChanged(state);}else{QHeaderView::mouseReleaseEvent(event);}m_bPressed = false;
}// 鼠标滑过、离开,更新复选框状态
bool TableHeaderView::event(QEvent *event)
{updateSection(0);if (event->type() == QEvent::Enter || event->type() == QEvent::Leave){QMouseEvent *pEvent = static_cast<QMouseEvent *>(event);int nColumn = logicalIndexAt(pEvent->x());if (nColumn == CHECK_BOX_COLUMN){m_bMoving = (event->type() == QEvent::Enter);update();return true;}}return QHeaderView::event(event);
}
// 调用方法#include <tablemodel.h>
#include <tableheaderview.h>{TableHeaderView *pHeader = new TableHeaderView(Qt::Orientation::Horizontal, this);TableModel *pModel = new TableModel(this);// 设置表头ui->tableView->setHorizontalHeader(pHeader);// 关联表头复选框与第一列复选框connect(pHeader, SIGNAL(stateChanged(int)), pModel, SLOT(onStateChanged(int)));connect(pModel, SIGNAL(stateChanged(int)), pHeader, SLOT(onStateChanged(int)));// 设置单行选中、最后一列拉伸、表头不高亮、无边框等ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);ui->tableView->horizontalHeader()->setStretchLastSection(true);ui->tableView->horizontalHeader()->setHighlightSections(false);ui->tableView->verticalHeader()->setVisible(false);ui->tableView->setShowGrid(false);ui->tableView->setFrameShape(QFrame::NoFrame);ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);ui->tableView->setModel(pModel);// 加载数据、更新界面QList<FileRecord> recordList;for (int i = 0; i < 5; ++i){FileRecord record;record.bChecked = false;record.strFilePath = QString("E:/Qt/image_%1.png").arg(i + 1);recordList.append(record);}pModel->updateData(recordList);
}

源码下载:QTableView复选框源码


http://chatgpt.dhexx.cn/article/A3PahjAU.shtml

相关文章

Qt QTableView QStandardItemModel用法

QStandardItemModel 是标准的以项数据&#xff08;item data&#xff09;为基础的标准数据模型类&#xff0c;通常与 QTableView 组合成 Model/View 结构&#xff0c;实现通用的二维数据的管理功能。 本节介绍 QStandardltemModel 的使用&#xff0c;主要用到以下 3 个类&#…

pyqt QTableView详细用法

QTableView是表格视图&#xff0c;可以像excel一样的显示数据&#xff0c;如下图&#xff1a; 详细代码&#xff1a; from PyQt5.QtWidgets import * from PyQt5.QtGui import * import sysclass TableView(QWidget):def __init__(self, argNone):super(TableView, self).__in…

QT QTableView(基于QStandardItemModel用法)操作详解

文章目录 前言关于QStandardItemModel上下翻页实例代码讲解 前言 前面详细介绍过QTableWidget的用法&#xff0c;今天想一次性把QTable系列写完&#xff0c;也就是QTabelview的使用&#xff0c;我发现使用QTableWidget如果频繁的clean&#xff0c;然后又set&#xff0c;会很卡…

Qt QTableView样式设置

Qt QTableView样式设置 显示效果 QSS设置 选中设置&#xff1a; 1 2 3 4 5 QTableView::item:selected { background:rgb(0,0,100); color:white; } 表头设置&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 QHeaderView::section:first { b…

Qt QTableView详解

一.常用接口 1.设置model&#xff0c;添加model数据 model new QStandardItemModel(this);model->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"性别"<<"年龄");QStandardItem *item00 new QStandardItem("…

QTableView常用设置

QTableView的设置比较复杂&#xff0c;做项目的时候总是搞忘&#xff0c;以本文记录一下它的样式、布局等设置方式。 目录 1、设置item布局1.1、平均铺满1.2、最后一项铺满 2、交替背景色2.1、行交替2.2、项交替 3、去掉选中虚线4、去掉网格线5、设置选中方式5.1、选中单个项目…

qt中Qtableview的用法

QTableView常用于实现数据的表格显示。下面我们如何按步骤实现学生信息表格&#xff1a; 一 添加表头 //准备数据模型 QStandardItemModel *student_model new QStandardItemModel(); student_model->setHorizontalHeaderItem(0, new QStandardItem(QObject::tr(&…

Qt深入浅出(十五)QTableView

QTableView ​ 表格视图控件QTableView&#xff0c;需要和QStandardItemModel, 配套使用&#xff0c;这套框架是基于MVC设计模式设计的&#xff0c;M(Model)是QStandardItemModel数据模型&#xff0c;不能单独显示出来。V(view)是指QTableView视图&#xff0c;要来显示数据模型…

Qt QTableView

TableView 表格视图控件QTableView&#xff0c;需要和QStandardItemModel, 配套使用&#xff0c;这套框架是基于MVC设计模式设计的&#xff0c;M(Model)是QStandardItemModel数据模型&#xff0c; 不能单独显示出来。V(view)是指QTableView视图&#xff0c;要来显示数据模型&…

QT QtableView操作详解

本文实现了使用QtableView控件来显示数据&#xff0c;数据源使用txt文本作为数据源&#xff0c;使用了QStandardItemModel作为数据模型来实现了对TableView空间的初始化&#xff0c;和对txt数据源的增删改查功能。 QT QtableView操作详解目录 1. 项目结构&软件界面 2. m…

QTableView使用方法小结

本文总结了QTableView常用方法&#xff0c;包括常规的数据显示、表头设置、字体和颜色设置、行列的高宽&#xff0c;显示格式设置等&#xff0c;还有一套分页算法&#xff0c;在QTableView表格里插入QLineEdit、QPushButton、QCheckBox等控件&#xff0c;常用的qss设置&#xf…

Qt之QTableView的简单使用(含源码+注释)

文章目录 一、QTableView操作示例图二、QTableView&#xff08;个人理解&#xff09;三、源码CMainWindow.hCMainWindow.cpp 四、拓展&#xff1a;代理的使用总结相关文章 一、QTableView操作示例图 下图为QTableView简单使用示例图&#xff0c;其中包含设置、获取、新建item等…

QTableView 基本使用

一、简介 表格视图控件 QTableView&#xff0c;需要和 QStandardItemModel 配套使用&#xff0c;这套框架是基于 MVC 设计模式设计的&#xff0c;M(Model) 是 QStandardItemModel 数据模型不能单独显示出来。V(view) 是指 QTableView 视图&#xff0c;要来显示数据模型&#x…

QTableView详细使用说明

QTableView详细使用说明 创建QTableView表格标题设置表格的标题获取表格的标题 数据操作插入数据删除数据 属性设置设置表格的对齐方式设置表格的宽高设置表格的线属性 自定义菜单eventFilter方法重载eventFilter()启用事件监听实现事件过滤函数 设置菜单属性方法设置属性关联信…

web前端新手面试指南:自我介绍

面试时注意&#xff1a;自我介绍不能太长&#xff0c;也不能过短&#xff0c;3分钟左右最合适&#xff0c;尤其做为web前端技术方面的面试&#xff0c;更加要说到点上&#xff0c;我依次从学习方面、项目实践、未来规划这三个方面写下web前端面试的自我介绍。 您好&#xff0c;…

Web前端面试自我介绍对话技巧注意事项

大家在学会了web前端技术后&#xff0c;当然是要准备找一个适合自己的web前端工作了&#xff0c;那么面试环节是必不可少的&#xff0c;有一个良好的自我介绍表述&#xff0c;在HR心中也能加分不少&#xff0c;接下来小编就为大家介绍一下Web前端面试自我介绍对话技巧注意事项。…

前端面试自我介绍的技巧都有哪些?

前端面试自我介绍的技巧都有哪些? 在前端面试自我介绍的时候&#xff0c;可能会遇到两种情况&#xff1a;允许主动和不允许主动&#xff01; 允许主动的情况下&#xff0c;前端程序员应该详细的介绍自己技能树&#xff0c;结合工作经历&#xff0c;展示给面试官自己对项目和…

JVM coredump

JVM crash分析 Java程序运行的时候&#xff0c;遇到了coredump的现象。最后定位到时JIT导致的bug。 http://www.oracle.com/technetwork/java/javase/crashes-137240.html#gbyzu 这里记录下JVMcrash产生的文件怎么去定位问题&#xff0c;但是一般不会遇到crash&#xff0c;h…

coredump 使用总结

1. core dump简介&#xff1a; A core dump is the recorded state of the working memory of a computer program at a specific time, generally when the program has terminated abnormally (crashed). In practice, other key pieces of program state are usually dumped…

【linux】coredump问题排查

序言 记录coredump问题的一些定位技巧 1. coredump简介 coredump称为核心转储&#xff0c;就是在进程异常时的一个快照&#xff0c;保存了异常时的内存、寄存器、堆栈等数据当进程接收到某些 信号 而导致异常退出时&#xff0c;就会生成 coredump 文件core文件是ELF文件格式…