在项目中,我们经常会遇到需要在表格中添加复选框,tableView有以下几种实现方式。
1、利用自定义委托QAbstractItemDelegate中的CreateEditor()函数来实现,这种实现方式加入的复选框需要双击才能显示控件,一般不能满足实际需求,用户体验很差。
2、利用QAbstractTableModel重写flag()函数,设置flag属性Qt::ItemUserCheckable,配合data(), setData()函数来实现。但这种方式实现的checkbox不能布局,总是显示在表格的最前端,不能实现居中显示。
3、利用自定义委托QAbstractItemDelegate,重写paint()函数。配合重写editorEvent()函数实现QCheckBox的功能。此方法用户体验好,适合扩展,还可以绘制其他控件。
本文主要介绍第二种方式,QAbstractTableModel重写flag()函数。
上代码
TableModel.h
继承QAbstractTableModel
#ifndef TABLEMODEL_H
#define TABLEMODEL_H
#include <QAbstractTableModel>
typedef struct ST_ROW_DATA
{
bool bCheckState = false;
QString strTestData = "";
}stRowData;
enum enColumnIndex
{
CheckBoxColumn,
QStringColumn
};
class TableModel : public QAbstractTableModel
{
Q_OBJECT
public:
explicit TableModel(QObject *parent = nullptr);
// Header:
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override;
// Basic functionality:
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent &#