QTableView

​ 表格视图控件QTableView,需要和QStandardItemModel, 配套使用,这套框架是基于MVC设计模式设计的,M(Model)是QStandardItemModel数据模型,不能单独显示出来。V(view)是指QTableView视图,要来显示数据模型,C(controllor)控制在Qt中被弱化,与View合并到一起。

1 QTableView简单应用

​ QStandardItmeModel表格的数据模型,那么这个模型需要填上每一行每一列的数据,就像execl表格一样。

​ widget.h


#ifndef WIDGET_H
#define WIDGET_H
​
#include <QTableView>
​
class Widget : public QTableView //继承至QTableView
{    Q_OBJECT
​
public:
    Widget(QWidget *parent = 0);
    ~Widget();
};
​
#endif // WIDGET_H

​ widget.cpp


#include "widget.h"
#include <QStandardItemModel>
#include <QDebug>
Widget::Widget(QWidget *parent)
    : QTableView(parent)
{   QStandardItemModel* model = new QStandardItemModel(this);
   model->setItem(0, 0, new QStandardItem("张三"));
   model->setItem(0, 1, new QStandardItem("3"));
   model->setItem(0, 2, new QStandardItem("男"));
   this->setModel(model);
}
​
Widget::~Widget()
{​
}

​ 以上代码实现了在model中添加一条数据,然后通过setModel函数设置view的数据模型为model,显示出来,如图:

2 修改行列字段名

​ 修改字段名可以使用QStandardItemModel::setHeaderData,但是在这之前你需要调用QStandardItemModel::setColumnCountQStandardItemModel::setRowCount,例如:


Widget::Widget(QWidget *parent)
    : QTableView(parent)
{   QStandardItemModel* model = new QStandardItemModel(this);
   /*设置列字段名*/
   model->setColumnCount(3);
   model->setHeaderData(0,Qt::Horizontal, "姓名");
   model->setHeaderData(1,Qt::Horizontal, "年龄");
   model->setHeaderData(2,Qt::Horizontal, "性别");
​
   /*设置行字段名*/
   model->setRowCount(3);
   model->setHeaderData(0,Qt::Vertical, "记录一");
   model->setHeaderData(1,Qt::Vertical, "记录二");
   model->setHeaderData(2,Qt::Vertical, "记录三");   

   /*设置一条数据*/
   model->setItem(0, 0, new QStandardItem("张三"));
   model->setItem(0, 1, new QStandardItem("3"));
   model->setItem(0, 2, new QStandardItem("男"));
   this->setModel(model);
}

3 移除数据

​ 移除数据的常用函数有:


/*移除某行数据*/
bool QAbstractItemModel::removeRow(int row, const QModelIndex &parent = QModelIndex())
/*移除某列数据*/
bool QAbstractItemModel::removeColumn(int column, const QModelIndex &parent = QModelIndex())

例如:


model->removeRow(0);//移除第0行数据
model->removeColumn(0);//移除第0列数据

4 插入数据

  • 插入一行数据


void QStandardItemModel::insertRow(int row, const QList<QStandardItem *> &items)
/*
* row 表示从第几行插入数据
* items 表示要插入的数据QStandardItem对象
*/
  • 例如:


QList<QStandardItem*> list;
list << new QStandardItem("王五") << new QStandardItem("22") << new QStandardItem("男");
model->insertRow(0, list); //在第0行插入一条记录

5 数据变更信号处理

​ 当QStandardModel中的数据被更改的时候,会发射出dataChanged信号:


[signal] void QAbstractItemModel::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int> ());
​
/*
*topLeft bottomRight这两索引指的是表格中被更改数据的区域,如果只有一个数据被更改,那么topLeft等于bottomRight
*/
​

例如:

widget.h


#ifndef WIDGET_H
#define WIDGET_H
​
#include <QTableView>
class QStandardItemModel;
class Widget : public QTableView
{    Q_OBJECT
public slots:
    void dataChangedSlot(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int> ());
public:
    Widget(QWidget *parent = 0);
    QStandardItemModel* _model;
    ~Widget();
};
​
#endif // WIDGET_H
​

widget.cpp


#include "widget.h"
#include <QStandardItemModel>
#include <QDebug>
Widget::Widget(QWidget *parent)
    : QTableView(parent)
{   _model = new QStandardItemModel(this);
   _model->setColumnCount(3);
   _model->setHeaderData(0,Qt::Horizontal, "姓名");
   _model->setHeaderData(1,Qt::Horizontal, "年龄");
   _model->setHeaderData(2,Qt::Horizontal, "性别");
​
   _model->setRowCount(3);
   _model->setHeaderData(0,Qt::Vertical, "记录一");
   _model->setHeaderData(1,Qt::Vertical, "记录二");
   _model->setHeaderData(2,Qt::Vertical, "记录三");
​
   _model->setItem(0, 0, new QStandardItem("张三"));
   _model->setItem(0, 1, new QStandardItem("3"));
   _model->setItem(0, 2, new QStandardItem("男"));
​
​
   connect(_model, SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector<int>)), this, SLOT(dataChangedSlot(QModelIndex,QModelIndex,QVector<int>)));
   this->setModel(_model);
}
​
void Widget::dataChangedSlot(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles)
{    qDebug() << _model->data(topLeft).toString() << endl;
​
}
​
Widget::~Widget()
{​
}

需要知道的是函数data可以获取想要的QStandardItem对象的索引:


[pure virtual] QVariant QAbstractItemModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const

返回的QVariant对象是一种泛型变量,可以转换成QString、int、double等数据类型。

6 常用函数


 //默认显示行头,如果你觉得不美观的话,我们可以将隐藏
tableview->verticalHeader()->hide();
​
 //设置选中时为整行选中
tableview->setSelectionBehavior(QAbstractItemView::SelectRows);         

 //设置表格的单元为只读属性,即不能编辑
tableview->setEditTriggers(QAbstractItemView::NoEditTriggers);
​
//返回一个被选中的所有Item的索引,一般是去遍历这个链表进行处理
[virtual protected] QModelIndexList QTableView::selectedIndexes() const

7 QStandardItem被点选信号

​ 当QStandardItemModel中的某个QStandardItem被点选后,QStandardItemModel对象会发出一个信号:


void QAbstractItemView::clicked(const QModelIndex &index);
/*
*返回被点选的Item的索引
*/

8 QItemDelegate代理

​ QTableView在处理信息显示编辑的时候比较单调,类似行编辑器,为了获得更多的灵性性,交互通过QItemDelegate执行。

​ 下面通过派生一个SpinDelegate来实现一个整数旋转框的代理器。

​ 一般我们要重写函数createEditor:


[virtual] QWidget *QItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
/*
*QWidget *parent一般是指哪个窗口使用了这个代理,一般用来托管内存
* QStyleOptionViewItem &option 样式风格
* const QModelIndex &index 需要更改的Item索引
*/

​ spinDelegate.h


#ifndef SPINDELEGATE_H
#define SPINDELEGATE_H
#include <QItemDelegate>
class SpinDelegate : public QItemDelegate
{public:
    SpinDelegate(QObject *parent = Q_NULLPTR);
    QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
​
#endif // SPINDELEGATE_H

​ spinDelegate.cpp


#include "spindelegate.h"
#include <QSpinBox>
SpinDelegate::SpinDelegate(QObject *parent): QItemDelegate(parent)
{​
}
QWidget* SpinDelegate::createEditor(QWidget *parent
           , const QStyleOptionViewItem &option, const QModelIndex &index) const
{    if(index.column() == 1) // 返回下拉框
    {       QSpinBox* box = new QSpinBox(parent);
       box->setMinimum(1);
       box->setMaximum(99);
       return box;
    }
    return QItemDelegate::createEditor(parent, option, index);
}

将widget.cpp中的构造器中修改如下函数如下:


Widget::Widget(QWidget *parent)
    : QTableView(parent)
{   QStandardItemModel* model = new QStandardItemModel(this);
   /*设置列字段名*/
   model->setColumnCount(3);
   model->setHeaderData(0,Qt::Horizontal, "姓名");
   model->setHeaderData(1,Qt::Horizontal, "年龄");
   model->setHeaderData(2,Qt::Horizontal, "性别");
​
   /*设置行字段名*/
   model->setRowCount(3);
   model->setHeaderData(0,Qt::Vertical, "记录一");
   model->setHeaderData(1,Qt::Vertical, "记录二");
   model->setHeaderData(2,Qt::Vertical, "记录三");   

   /*设置一条数据*/
   model->setItem(0, 0, new QStandardItem("张三"));
   model->setItem(0, 1, new QStandardItem("3"));
   model->setItem(0, 2, new QStandardItem("男"));
   this->setModel(model);
   /*设置代理*/
   this->setItemDelegate(new SpinDelegate(this));
}

Qt深入浅出(十五)QTableView相关推荐

  1. Qt笔记(十五)之设置程序图标

    一.前言 设置程序图标是使用Qt开发应用软件最基本的的东西,可是楼主一开始接触的时候捣鼓了许久,故在此做个记录 二.具体实现 1.准备工作 新建一个资源文件qrc(主要是为了统一管理图标文件) 添加需 ...

  2. QT开发(五十)——QT串口编程基础

    QT开发(五十)--QT串口编程基础 一.QtSerialPort简介 1.串口通信基础 目前使用最广泛的串口为DB9接口,适用于较近距离的通信.一般小于10米.DB9接口有9个针脚. 串口通信的主要 ...

  3. 《深入浅出DPDK》读书笔记(十五):DPDK应用篇(Open vSwitch(OVS)中的DPDK性能加速)

    Table of Contents Open vSwitch(OVS)中的DPDK性能加速 174.虚拟交换机简介 175.OVS简介 176.DPDK加速的OVS 177.OVS的数据通路 178. ...

  4. 深入浅出Zabbix 3.0 -- 第十五章 Zabbix 协议与API

    第十五章 Zabbix 协议与API 本章将介绍和开发相关的Zabbix协议和API的内容,通过对Zabbix协议和API的深入了解,你可以利用Zabbix协议编写客户端程序并将其嵌入的产品或系统中, ...

  5. 不新的《万历十五年》

    http://www.cnnovels.com/xdwx/wangxiaobo/qt/017.htm 不新的<万历十五年> -------------------------------- ...

  6. java常见面试考点(二十五):CAS是什么

    java常见面试考点 往期文章推荐:   java常见面试考点(二十):Elasticsearch 和 solr 的区别   java常见面试考点(二十一):单点登录   java常见面试考点(二十二 ...

  7. 2021年大数据HBase(十五):HBase的Bulk Load批量加载操作

    全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 HBase的Bulk Load批量加载操作 一.Bulk L ...

  8. 2021年大数据Hadoop(二十五):YARN通俗介绍和基本架构

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 YARN通俗介绍和基本架构 Yarn通俗介绍 Yarn基本 ...

  9. 2021年大数据Hadoop(十五):Hadoop的联邦机制 Federation

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 Hadoop的联邦机制 Federation 背景概述 F ...

  10. 十五天精通WCF——第六天 你必须要了解的3种通信模式

    十五天精通WCF--第六天 你必须要了解的3种通信模式 原文:十五天精通WCF--第六天 你必须要了解的3种通信模式 wcf已经说到第六天了,居然还没有说到这玩意有几种通信模式,惭愧惭愧,不过很简单啦 ...

最新文章

  1. C++:随笔9----模板/内联函数/容器
  2. oracle的into的含义,请问在oracle 中select into是什么意思?
  3. RocketMQ初步应用架构理论
  4. 交换两个整型变量的数值
  5. 【AI视野·今日Robot 机器人论文速览 第二十五期】Fri, 1 Oct 2021
  6. GitHub的常用命令---终端操作
  7. ElasticSearch 插件开发
  8. BZOJ5212: [Zjoi2018]历史
  9. vba ado返回集合_带你进入VBA中Address地址世界
  10. matlab实现m-k突变的,用matlab进行mk趋势分析与突变检验.pdf
  11. Windows 中使用苹果 macOS 动态桌面壁纸
  12. JavaScript常见的网页特效(元素样式相关属性)
  13. 扫普通二维码打开小程序配置详情
  14. 惠普触控板使用指南_hp触摸板开关怎么使用 如何锁定hp触摸板
  15. 随机地图生成工具 fastMapper
  16. 常用的免费好用的DNS有哪些?
  17. 论文研究结论怎么写?
  18. Qt获取windows文档、下载、图片等目录路径
  19. 连续时间周期信号傅里叶级数
  20. 【讲清楚】rebase的使用

热门文章

  1. WorkBook的SaveAs方法
  2. 【无线网络技术】WLAN技术学习笔记
  3. SpringBoot 打成的 jar 包和普通的 jar 包有什么区别
  4. linux和乌班图和麒麟系统,UbuntuKylin 和麒麟系统是两支不同渠道的系统
  5. MySQL连接查询——连接查询的综合应用
  6. Mysql中自定义函数的创建和执行
  7. Word 中插入高亮代码 | planetB | syntax-highlight-word
  8. 使用customRef自定义ref,解决setup中处理异步问题。
  9. mirna富集分析_miRNA富集分析数据库
  10. 在线图书销售系统顺序图_良心好用的在线学习工具,你知道和不知道的,这里都有~...