QSqltableModel添加复选框

用QTableView,经常会有单选、多选、全选的需求,很多软件提供很简单、直观的方式——复选框。Qt中也可以很容易的进行实现。
网上有一些很好的总结,请参考:http://qimo601.iteye.com/blog/1538364。

参考内容

Qt 之 QTableView 添加复选框(QAbstractTableModel)

qt QSqlTableModel在tableview显示checkbox添加复选框

  1. 编辑委托

    利用委托中重载createEditor(),激活 QCheckBox,这个缺点是必须双击/选中,才能显示CheckBox控件。一般不满足实际中的直接显示的需要。

  2. 设置QAbstractTableModel的flags()函数

    通过重写setData()与data()来实现。

  3. 使用QTableView的setIndexWidget(const QModelIndex &index, QWidget *widget)来实现。

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

  4. 自定义委托,通过paint()方法来实现。

    这种方式比较复杂,但适合扩展,除了可以嵌入复选框,还可以通过绘制其它控件,按钮、图片等自定义风格。

使用示例

(第二种方式)
重写 QSqlTableModel来实现添加不同的控件,这个也是常用的方法。

头文件 h

#ifndef TABLEMODEL_H
#define TABLEMODEL_H
#include <QSqlTableModel>
#include <QDebug>
#include <QSqlRecord>
#include <QColor>
#include <QMap>
class TableModel : public QSqlTableModel
{
Q_OBJECT
public:
explicit TableModel(QObject *parent = nullptr);
bool setData( const QModelIndex &index, const QVariant &value, int role );
QVariant data(const QModelIndex &index, int role) const;
Qt::ItemFlags flags(const QModelIndex &index) const;
signals:
};
#endif // TABLEMODEL_H

源文件 cpp

#include "tablemodel.h"
QMap<int, Qt::CheckState> check_state_map;
static int checkColumn = 0;//第几列为复选框,从0开始计算
TableModel::TableModel(QObject *parent, QSqlDatabase db) : QSqlTableModel(parent)
{
}
bool TableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if(!index.isValid())
return false;
if (role == Qt::CheckStateRole && index.column() == checkColumn)
{
check_state_map[index.row()] = (value == Qt::Checked ? Qt::Checked : Qt::Unchecked);
return true;
}
else
return QSqlTableModel::setData(index, value,role);
}
//初始化的时候会进入此处给复选框设置是否勾选
QVariant TableModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid()) // ---> 索引无效,返回默认值
return QVariant();
if (index.column() != checkColumn ) // ---> 索引有效,且列是要设置复选框的列
{
return QSqlTableModel::data(index, role);
}
Qt::CheckState findCheck = Qt::Unchecked;
QString test = QSqlTableModel::data(index, role).toString();
//在QSqlTableModel得到数据,保存在QMap中
if( !test.isEmpty() )
{
if(test.toInt())
{
findCheck = Qt::Checked;
}
else
{
findCheck = Qt::Unchecked;
}
check_state_map.insert(index.row(), findCheck);
}
switch(role)
{
case Qt::TextColorRole:
return QColor(Qt::red);
case Qt::TextAlignmentRole:
return QVariant(Qt::AlignLeft | Qt::AlignVCenter);
case Qt::CheckStateRole:
if(index.column() == checkColumn)
{
if (check_state_map.contains(index.row()))
{
//判断是否为QMap保存的key,是的话将数据做判断
return check_state_map[index.row()] == Qt::Checked ? Qt::Checked : Qt::Unchecked;
}
return findCheck;
}
}
return QVariant();
}
Qt::ItemFlags TableModel::flags(const QModelIndex &index) const
{
// if (!index.isValid())
// return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
if (index.column() == checkColumn)
return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable;
else
return QSqlTableModel::flags(index);
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
}
posted @   看不见的R  阅读(912)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示