QSqltableModel添加复选框
2022/2/2 2:30:36
本文主要是介绍QSqltableModel添加复选框,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
用QTableView,经常会有单选、多选、全选的需求,很多软件提供很简单、直观的方式——复选框。Qt中也可以很容易的进行实现。
网上有一些很好的总结,请参考:http://qimo601.iteye.com/blog/1538364。
参考内容
Qt 之 QTableView 添加复选框(QAbstractTableModel)
qt QSqlTableModel在tableview显示checkbox添加复选框
-
编辑委托
利用委托中重载createEditor(),激活 QCheckBox,这个缺点是必须双击/选中,才能显示CheckBox控件。一般不满足实际中的直接显示的需要。
-
设置QAbstractTableModel的flags()函数
通过重写setData()与data()来实现。
-
使用QTableView的setIndexWidget(const QModelIndex &index, QWidget *widget)来实现。
此功能只应该用来显示可视区域内对应一个数据项的静态内容。如果想显示自定义的动态内容或执行自定义编辑器部件,子类化 QItemDelegate代替。也就是说,这只适合做静态数据的显示,不适合做一些插入、更新、删除操作的数据显示。
-
自定义委托,通过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; }
这篇关于QSqltableModel添加复选框的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-02Java管理系统项目实战入门教程
- 2024-11-02Java监控系统项目实战教程
- 2024-11-02Java就业项目项目实战:从入门到初级工程师的必备技能
- 2024-11-02Java全端项目实战入门教程
- 2024-11-02Java全栈项目实战:从入门到初级应用
- 2024-11-02Java日志系统项目实战:初学者完全指南
- 2024-11-02Java微服务系统项目实战入门教程
- 2024-11-02Java微服务项目实战:新手入门指南
- 2024-11-02Java项目实战:新手入门教程
- 2024-11-02Java小程序项目实战:从入门到简单应用