Qt之QTableView添加复选框(QAbstractTableModel)

简述

使用QTableView,经常会遇到复选框,要实现一个好的复选框,除了常规的功能外,还应注意以下几点:

  1. 三态:不选/半选/全选
  2. 自定义风格(样式)

下面我们介绍一下常见的实现方式:

  • 编辑委托。
    方式:利用委托重载createEditor(),激活QCheckBox。
    特点:必须双击/选中,才能显示CheckBox控件。一般不满足实际中的直接显示的需要。

  • 使用QTableView的setIndexWidget(const QModelIndex &index, QWidget *widget)来实现。
    此功能用来显示可视区域内对应一个数据项的静态内容。如果想显示自定义的动态内容或执行自定义编辑器部件,子类化QItemDelegate代替。也就是说,这只适合做静态数据的显示,不适合做一些插入、更新、删除操作的数据显示。

  • 自定义模型QAbstractTableModel,通过flags()函数来实现。
    方式:通过将flags()设置为Qt::ItemIsUserCheckable实现可选中,然后配合setData()与data()来实现。
    特点:直接显示,可定义样式,默认左对齐,很难实现居中、右对齐。

  • 自定义委托QAbstractItemDelegate,通过paint()函数来实现。
    方式:通过控制editorEvent()实现鼠标的点击进行全选/半选/不选,然后由paint()实时绘制。
    特点:这种方式比较复杂,但适合扩展,除了可以嵌入复选框,还可以绘制其它控件-按钮、图片等。

效果

这里写图片描述

下面我们来介绍如何利用QAbstractTableModel的flags()函数来实现复选功能。

QAbstractTableModel

源码

table_model.cpp

#define CHECK_BOX_COLUMN 0
#define File_PATH_COLUMN 1

TableModel::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)
    {
 
  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QtQTableView添加复选框可以通过自定义QAbstractItemDelegate来实现。 首先,我们需要创建一个继承于QAbstractItemDelegate的代理类。在该类中,我们需要重写创建编辑器和更新模型数据的方法。为了在单元格中显示复选框,我们可以使用QCheckBox作为编辑器。 QCheckBox* checkBox = new QCheckBox(); checkBox->setCheckState(index.data(Qt::DisplayRole).toBool() ? Qt::Checked : Qt::Unchecked); // 获取当前单元格数据的布尔值,并设置复选框的选中状态 接下来,我们需要重写setValue和setEditorData方法,用于将复选框的状态应用到模型数据中。 void CheckBoxDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const { QCheckBox* checkBox = qobject_cast<QCheckBox*>(editor); if (!checkBox) return; bool value = index.model()->data(index, Qt::DisplayRole).toBool(); checkBox->setCheckState(value ? Qt::Checked : Qt::Unchecked); } void CheckBoxDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const { QCheckBox* checkBox = qobject_cast<QCheckBox*>(editor); if (!checkBox) return; bool value = (checkBox->checkState() == Qt::Checked); model->setData(index, value, Qt::EditRole); } 接下来,我们需要在QTableView中设置我们的代理类。在创建QTableView实例后,调用setItemDelegateForColumn方法,将该列的代理设置为我们的CheckBoxDelegate实例。 CheckBoxDelegate* delegate = new CheckBoxDelegate(this); tableView->setItemDelegateForColumn(columnIndex, delegate); 现在,我们的QTableView中的指定列应该显示为复选框。当用户点击复选框时,数据将根据用户的选择自动更新到模型中。 需要注意的是,在创建代理类之前,我们需要在模型中将对应的数据列设置为布尔值类型。 通过自定义QAbstractItemDelegate并结合QCheckBox,我们可以轻松地在QTableView添加复选框。这样,我们就可以方便地实现复选框功能并与模型数据交互。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值