`
qimo601
  • 浏览: 3449646 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

(二)Qt中QTableView中加入Check列实现

    博客分类:
  • Qt
阅读更多
QTableView中嵌入复选框CheckBox
       第二种方法:设置QAbstractTableModel的flags()函数法
        通过Delegate创建QCheckBox来实现的Check列,只有在该列进入编辑模式时才能够Check/Uncheck。这显然不是我们想要的,网上翻来翻去,在一个国外论坛中看到了无需Delegate的实现方法,只需重写Model即可:

主要是修改两个函数:
//设置某一列为可选角色,绘画出QCheckBox
Qt::ItemFlags flags(const QModelIndex &index) const; 
//根据界面选择QCheckbox,修改Model中的数据
 bool setData(const QModelIndex &index, const QVariant &value, int role);

2.在StudentInfoModel .h头文件中的主要代码:
class StudentInfoModel : public QAbstractTableModel 
{
    Q_OBJECT
public:
    StudentInfoModel(const int totalColumn, const int aColumnNumWithChechBox = 0, QObject *parent = 0)
    :totalColumn(totalColumn),colNumberWithCheckBox(aColumnNumWithChechBox),
	
    QAbstractTableModel(parent) {rowCheckStateMap.clear();};
public:
    int rowCount(const QModelIndex &parent = QModelIndex()) const;
    int columnCount(const QModelIndex &parent = QModelIndex()) const;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
    Qt::ItemFlags flags(const QModelIndex &index) const;
    bool setData(const QModelIndex &index, const QVariant &value, int role);


public:
    void AddStudentInfo(const StudentInfo &studentInfo);


    signals:
    void StudentInfoIsChecked(const StudentInfo &studentInfo);


private:
    typedef QVector<StudentInfo> StudentInfos;
    StudentInfos studentInfos;
    int totalColumn;
    int colNumberWithCheckBox;
    QMap<int, Qt::CheckState> rowCheckStateMap;
};


3.在StudentInfoModel.cpp文件中的主要代码如下:
QVariant StudentInfoModel::data( const QModelIndex &index, int role ) const
{
    if (role == Qt::DisplayRole) 
	{ 
		if (index.column() == 0) 
			return QString::number(index.row()+1); 
		if (index.column() == 1) 
			return studentInfos[index.row()].stuNumber; 
		if (index.column() == 2)
			return studentInfos[index.row()].stuName; 
		if (index.column() == 3)
			return studentInfos[index.row()].stuID; 
		if (index.column() == 4)
			return studentInfos[index.row()].stuPhoneNumber;
		if (index.column() == 5) 
			return studentInfos[index.row()].department; 
		if (index.column() == 6) 
			return studentInfos[index.row()].stuDescription; 
	} 
	if (role == Qt::CheckStateRole) 
	{ 
		if (index.column() == colNumberWithCheckBox) 
		{ 
			if (rowCheckStateMap.contains(index.row())) 
			return rowCheckStateMap[index.row()] == Qt::Checked ? Qt::Checked : Qt::Unchecked; return Qt::Unchecked; 
		} 
	} 
	return QVariant();
}


Qt::ItemFlags StudentInfoModel::flags( const QModelIndex &index ) const
{
    if
    (!index.isValid())
    return 0;


    if (index.column() == colNumberWithCheckBox)
    return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable;


    return  Qt::ItemIsEnabled | Qt::ItemIsSelectable;
}


bool StudentInfoModel::setData( const QModelIndex &index, const QVariant &value, int role )
{
    if(!index.isValid())
		return false;
    if (role == Qt::CheckStateRole && index.column() == colNumberWithCheckBox)
    {
        if (value == Qt::Checked) //
        {
            rowCheckStateMap[index.row()] = Qt::Checked; 
            if(studentInfos.size() > index.row())
            emit StudentInfoIsChecked(studentInfos[index.row()]);
        }
        else
        {
            rowCheckStateMap[index.row()] = Qt::Unchecked;
        } 
    }
    return true;
}
 
 
 

  • 大小: 22.1 KB
分享到:
评论
2 楼 a2865285 2014-05-25  
a2865285 写道
构造函数 StudentInfoModel 下面的是什么啊

:totalColumn(totalColumn),colNumberWithCheckBox(aColumnNumWithChechBox), 
     
    QAbstractTableModel(parent) {rowCheckStateMap.clear();}; 


哦 我去 看出来了 初始化参数列表....
1 楼 a2865285 2014-05-25  
构造函数 StudentInfoModel 下面的是什么啊

:totalColumn(totalColumn),colNumberWithCheckBox(aColumnNumWithChechBox), 
     
    QAbstractTableModel(parent) {rowCheckStateMap.clear();}; 

相关推荐

    Qt编程-QTableView同时冻结行和列

    以下我们将详细探讨如何在Qt中实现QTableView同时冻结行和列的功能。 首先,我们需要理解QTableView的工作原理。QTableView是基于QAbstractItemView构建的,它通过模型-视图-代理(Model-View-Proxy)架构来显示...

    Qt编程-QTableView冻结行或冻结列或冻结局部单元格

    总结来说,实现Qt中的QTableView冻结行、列或局部单元格主要涉及自定义视图类,重写滚动事件,以及可能的多视口管理。通过这样的方式,你可以为用户提供一个更加直观和高效的表格浏览体验。在开发过程中,记得持续...

    QT在QTableView的一列里添加两个按钮

    在QT中,要在QTableView的一列中添加两个按钮,我们需要了解以下几个关键知识点: 1. **QTableView**:QTableView是QTableView类的实例,它提供了一个二维表格视图,可以用来显示和编辑模型数据。QTableView可以...

    基于QT中的QTableView实现表格翻页标签(精准定位、表格可拖动大小、可与滑动条联动)

    总结一下,要在QT中基于QTableView实现表格翻页标签,你需要: 1. 理解QTableView和数据模型的关系。 2. 连接滚动条的信号槽,实现翻页功能。 3. 实现精准定位,正确处理滚动条变化时的索引更新。 4. 启用并调整表格...

    Qt之QTableView添加复选框

    本教程将深入探讨如何在QTableView中添加复选框,特别是在表头和第一列中实现这一功能,以增强用户界面的交互性。 首先,我们要明白QTableView的工作原理。它是基于QAbstractItemView类的,通过QStandardItemModel...

    qt,QTableView实现复选框,分页功能

    在Qt框架中,QTableView是用于显示表格数据的控件,它可以很好地与各种模型(如QStandardItemModel或QSqlTableModel)结合使用。本教程将详细讲解如何在QTableView中实现复选框、分页和查询功能,并涉及与MySQL...

    封装QTableView,支持拖拽列,冻结列,自绘表头等操作

    1. **拖拽列**:在QTableView中实现拖拽列功能,主要是通过重载默认的行为并处理`dragMoveEvent`和`dropEvent`等事件来实现的。开发者通常会创建一个QTableView的子类,并通过`setDragDropOverwriteMode`、`...

    Qt中将QTableView中的数据导出为Excel文件实例QT4

    原文为《Qt中将QTableView中的数据导出为Excel文件&gt;&gt;,地址http://blog.csdn.net/superjoel/article/details/5321404。代码为QT4,QT5有些问题,因为只是参考里面的代码,就不是很在意。

    QT表格QTableView打印代码实现.rar

    使用QPainter和QPrinter;思路是设置首先规定纸张大小为1024*724,然后遍历行列,将表格分割若干小块,然后调用TableView-&gt;...借鉴了https://blog.csdn.net/superjoel/article/details/5177199思路,实现代码

    QT QTableView用法总结

    QT QTableView是QT框架中的一种视图控件,用于显示表格数据。下面我们将详细介绍QT QTableView的用法,包括设置表头、设置表格属性、动态添加行等。 一、设置表头 在使用QT QTableView之前,我们需要首先设置表头...

    QT - QTableView表格视图的列宽设置 - 王严の博客 - CSDN博客1

    在Qt框架中,QTableView是一种常用的控件,用于显示二维数据模型,如QStandardItemModel或自定义的数据模型。本文将详细讲解如何设置QTableView的列宽,以优化表格的显示效果。 方法一:使用`setSectionResizeMode...

    Qt中将QTableView中的数据导出为Excel文件实例

    原文为《Qt中将QTableView中的数据导出为Excel文件&gt;&gt;,地址http://blog.csdn.net/superjoel/article/details/5321404,资源比较难下载,我下载好帮作者上传下。实例可用,简单易懂,对于QTableView导出为excel...

    Qt中将QTableView中的数据导出为Excel文件实例QT5可以编译运行

    原文为《Qt中将QTableView中的数据导出为Excel文件&gt;&gt;,地址http://blog.csdn.net/superjoel/article/details/5321404。经过修改,支持QT的编译和运行。

    qt qtableview在表头中添加combobox,checkbox,spinbox

    在Qt编程中,QTableView是用于显示表格数据的控件,而QHeaderView则是QTableView的一部分,用于展示列头或行头。本主题聚焦于如何在QTableView的表头(QHeaderView)中添加更丰富的交互元素,如Combobox(下拉框)、...

    QTableView更新拖拽列功能啦

    在Qt中,我们可以重写`dragMoveEvent`和`dropEvent`这两个信号来处理拖放操作。`dragMoveEvent`是在拖动过程中触发的事件,而`dropEvent`则在释放鼠标时,确定目标位置时触发。 以下是一些关键步骤: 1. **启用...

    Qt QTableView插入控件,qss设计

    在Qt框架中,QTableView是用于显示表格数据的控件,它是Qt Widgets模块的一部分,广泛应用于桌面应用开发中。QTableView允许用户以表格形式展示结构化的数据,支持数据的编辑、排序和筛选功能。本教程将深入探讨如何...

    QT Creater Qtableview demo

    QTableView是QT库中的一个关键部件,它允许开发者创建表格视图,用于显示和编辑二维数据。 首先,QTableView是Qt Widgets模块的一部分,它可以和QAbstractItemModel一起使用,为用户提供灵活的数据展示。...

    qt qtableview动态代理

    在Qt框架中,QTableView是用于显示表格数据的控件,通常与QAbstractItemModel或QStandardItemModel一起使用。然而,QTableView的功能可以进一步增强,通过实现动态代理(Dynamic Proxy)来扩展其交互性。动态代理...

Global site tag (gtag.js) - Google Analytics