转载:吓人的猿

TableView

表格视图控件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 = );
~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(, , new QStandardItem("张三"));
model->setItem(, , new QStandardItem(""));
model->setItem(, , 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();
model->setHeaderData(,Qt::Horizontal, "姓名");
model->setHeaderData(,Qt::Horizontal, "年龄");
model->setHeaderData(,Qt::Horizontal, "性别");
/*设置行字段名*/
model->setRowCount();
model->setHeaderData(,Qt::Vertical, "记录一");
model->setHeaderData(,Qt::Vertical, "记录二");
model->setHeaderData(,Qt::Vertical, "记录三"); /*设置一条数据*/
model->setItem(, , new QStandardItem("张三"));
model->setItem(, , new QStandardItem(""));
model->setItem(, , new QStandardItem("男"));
this->setModel(model);
}

把1中的构造函数换为以上代码,运行即可得出下图:

3 移除数据

移除数据的常用函数有:

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

例如:

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

4 插入数据

插入一行数据:

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

例如:

QList<QStandardItem*> list;
list << new QStandardItem("王五") << new QStandardItem("") << new QStandardItem("男");
model->insertRow(, 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 = );
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();
model->setHeaderData(,Qt::Horizontal, "姓名");
model->setHeaderData(,Qt::Horizontal, "年龄");
model->setHeaderData(,Qt::Horizontal, "性别");
model->setRowCount();
model->setHeaderData(,Qt::Vertical, "记录一");
model->setHeaderData(,Qt::Vertical, "记录二");
model->setHeaderData(,Qt::Vertical, "记录三");
model->setItem(, , new QStandardItem("张三"));
model->setItem(, , new QStandardItem(""));
model->setItem(, , 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索引
*/

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 = );
QStandardItemModel* model;
~Widget();
}; #endif

widget.cpp

#include "widget.h"
#include "spindelegate.h"
#include <QStandardItemModel>
#include <QDebug> Widget::Widget(QWidget *parent)
: QTableView(parent)
{
model = new QStandardItemModel(this);
//设置列字段名
model->setColumnCount();
model->setHeaderData(,Qt::Horizontal,"姓名");
model->setHeaderData(,Qt::Horizontal,"年龄");
model->setHeaderData(,Qt::Horizontal,"性别");
//设置行字段名
model->setRowCount();
model->setHeaderData(,Qt::Vertical, "记录一");
model->setHeaderData(,Qt::Vertical, "记录二");
model->setHeaderData(,Qt::Vertical, "记录三");
//设置一条数据
model->setItem(, , new QStandardItem("张三"));
model->setItem(, , new QStandardItem(""));
model->setItem(, , new QStandardItem("男"));
this->setModel(model);
//设置代理
this->setItemDelegate(new SpinDelegate(this));
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()
{
}

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() == ) // 返回下拉框
{
QSpinBox* box = new QSpinBox(parent);
box->setMinimum();
box->setMaximum();
return box;
}
return QItemDelegate::createEditor(parent, option, index);
}

Qt深入浅出(十五)QTableView的更多相关文章

  1. 【夸QT在十五】ctkPluginFrameWork插件系统Windows编译器

    采用ctkPluginFramework作为一个插件系统开发框架确实有很多优点. 有些车站最近收到的一封信,每个人都想用ctkPluginFramework但我不知道如何建立,本教程对谈ctkPlug ...

  2. 第十五次oo作业

    作业十五 测试与正确性论证的效果差异 程序的测试需要通过输入特定数据等方式,检查程序是否和预期相同,因为测试不可能穷举,导致了不穷举的测试不可能验证程序是完全正确的,只能验证程序在测试时没有发生错误, ...

  3. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  4. OpenCV开发笔记(六十五):红胖子8分钟带你深入了解ORB特征点(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  5. 我的MYSQL学习心得(十五) 日志

    我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  6. Bootstrap <基础二十五>警告(Alerts)

    警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个 ...

  7. Bootstrap<基础十五> 输入框组

    Bootstrap 支持的另一个特性,输入框组.输入框组扩展自 表单控件.使用输入框组,可以很容易地向基于文本的输入框添加作为前缀和后缀的文本或按钮. 通过向输入域添加前缀和后缀的内容,您可以向用户输 ...

  8. 解剖SQLSERVER 第十五篇 SQLSERVER存储过程的源文本存放在哪里?(译)

    解剖SQLSERVER 第十五篇  SQLSERVER存储过程的源文本存放在哪里?(译) http://improve.dk/where-does-sql-server-store-the-sourc ...

  9. Senparc.Weixin.MP SDK 微信公众平台开发教程(十五):消息加密

    前不久,微信的企业号使用了强制的消息加密方式,随后公众号也加入了可选的消息加密选项.目前企业号和公众号的加密方式是一致的(格式会有少许差别). 加密设置 进入公众号后台的“开发者中心”,我们可以看到U ...

  10. 十五个常用的jquery代码段【转】

    好的文章顶一个 回到顶部按钮 通过使用 jQuery 中的 animate 和 scrollTop 方法,你无需插件便可创建一个简单地回到顶部动画: 1 // Back to top 2 $('a.t ...

随机推荐

  1. sparkStreaming获取kafka数据(java版本)

    环境 spark-2.2.0 kafka_2.11-0.10.0.1 jdk1.8 配置好jdk,创建项目并将kafka和spark的jar包添加到项目中,除此之外还需要添加spark-streami ...

  2. python django day 2

    django-admin.py startproject zqxt_viewscd zqxt_viewspython manage.py startapp calczqxt_views/urls.py ...

  3. git使用之放弃本地修改

    一,未使用 git add 缓存代码时. 可以使用 git checkout  --  filepathname (比如: git checkout -- readme.md ,不要忘记中间的 “-- ...

  4. 小白python 安装

    小白python 安装: https://blog.csdn.net/qq_36667170/article/details/79275605 https://blog.csdn.net/nmjuzi ...

  5. 初学者须知 常见的HTML5开发工具有哪些

    HTML5被看做是Web前端开发的最佳编程语言,具有多设备.跨平台.即时更新等优势.更重要的是HTML5入门简单,就业前景广.薪资福利高,这促使越来越多的人转行学习HTML5.学习要一步一个脚印,今天 ...

  6. 07机器学习实战k-means

    K-Means原理初探 K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇.让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大. 如果我们想直接求上式的最 ...

  7. MATLAB中多个一维数组的合并

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013538664/article/details/37673711 1.一维数组直接合并      ...

  8. 普林斯顿数学指南(第一卷) (Timothy Gowers 著)

    第I部分 引论 I.1 数学是做什么的 I.2 数学的语言和语法 I.3 一些基本的数学定义 I.4 数学研究的一般目的 第II部分 现代数学的起源 II.1 从数到数系 II.2 几何学 II.3 ...

  9. java 打印图形

    打印菱形 package study.stage2; /** * Created by Sandy.Liu on 2017/7/27. */public class Diamond { public ...

  10. 动态quartz新增、修改、删除

    1.定义job导出类 public class MyQuartzJob implements Job { private static Logger logger = LoggerFactory.ge ...