QT表格控件QTableView简介

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

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

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓

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,显示出来,如图:

QTableView修改行列字段名

​修改字段名可以使用QStandardItemModel::setHeaderData,但是在这之前你需要调用QStandardItemModel::setColumnCount和QStandardItemModel::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);
}

QTableView移除数据

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

/*移除某行数据*/
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列数据

QTableView插入数据

插入一行数据

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行插入一条记录

QTableView数据变更信号处理

[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等数据类型。

QTableView常用函数

 //默认显示行头,如果你觉得不美观的话,我们可以将隐藏
tableview->verticalHeader()->hide();
​//设置选中时为整行选中
tableview->setSelectionBehavior(QAbstractItemView::SelectRows);         //设置表格的单元为只读属性,即不能编辑
tableview->setEditTriggers(QAbstractItemView::NoEditTriggers);
​
//返回一个被选中的所有Item的索引,一般是去遍历这个链表进行处理
[virtual protected] QModelIndexList QTableView::selectedIndexes() const

本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓

QStandardItem被点选信号

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

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

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开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓

Qt GUI图形图像开发之QT表格控件QTableView详细使用方法与实例相关推荐

  1. python表格控件_python GUI库图形界面开发之PyQt5表格控件QTableView详细使用方法与实例...

    PyQt5表格控件QTableView简介 在通常情况下,一个应用需要和一批数据进行交互,然后以表格的形式输出这些信息,这时就需要用到QTableView类了,在QTableView中可以使用自定义的 ...

  2. python gui 显示表格_python GUI库图形界面开发之PyQt5表格控件QTableView详细使用方法与实例...

    PyQt5表格控件QTableView简介 在通常情况下,一个应用需要和一批数据进行交互,然后以表格的形式输出这些信息,这时就需要用到QTableView类了,在QTableView中可以使用自定义的 ...

  3. python gui控件案例_python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例...

    PyQt5布局控件QHBoxLayout简介 采用QBOXLayout类可以在水平和垂直方向上排列控件,QHBoxLayout和QVBoxLayout类继承自QBoxLayout 采用QHBoxLay ...

  4. qpython3可视图形界面_python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法...

    QWidget基本介绍 基础窗口控件QWidget类是所有用户界面对象的基类,所有的窗口或者控件都直接或者间接的继承自QWidget类. 窗口坐标系统 PyQt使用统一的坐标系统来定位窗口控件的位置和 ...

  5. pythongui项目实例_python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例...

    PyQt5状态栏控件QStatusBar简介 MainWindow对象在底部保留有一个水平条,作为状态栏(QstatusBar),用于显示永久或临时的状态信息 QStatusBar类中的常用方法 方法 ...

  6. pythongui界面实例带注释_python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例...

    PyQt5状态栏控件QStatusBar简介 MainWindow对象在底部保留有一个水平条,作为状态栏(QstatusBar),用于显示永久或临时的状态信息 QStatusBar类中的常用方法 方法 ...

  7. python选项卡控件_python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与...

    PyQt5选项卡控件QTabWidget简介 QTabWidget控件提供了一个选项卡和一个页面区域,默认显示第一个选项卡的页面,通过单击各选项卡可以查看对应的界面,如果在一个窗口中显示的输入字段很多 ...

  8. python gui界面 tcp_python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法

    QWidget基本介绍 基础窗口控件QWidget类是所有用户界面对象的基类,所有的窗口或者控件都直接或者间接的继承自QWidget类. 窗口坐标系统 PyQt使用统一的坐标系统来定位窗口控件的位置和 ...

  9. tablewidget 多行表头_Qt GUI图形图像开发之QT表格控件QTableView,QTableWidget复杂表头(多行表头) 及冻结、固定特定的行的详细方法与实例...

    我们在开发过程中对于表格使用频率还是挺高的,使用QT框架开发时候我们使用QTableView或者QTableWidget创建表格. 其中表格分为 表格头与表格体: 对于简单地表格,我们可以设置表头来满 ...

最新文章

  1. 才做三个月的新业务,为何唐岩对陌陌直播寄予厚望
  2. 泛域名Wildcard Domain
  3. ROSA 2012 Enterprise Linux Server 发布
  4. POJ1083 Moving Tables
  5. 《MySQL——事务》
  6. 《孙哥说Spring5》学习笔记
  7. Android Robolectric 加载运行本地 So 动态库
  8. Intelligence System HDU - 3072(强连通分量)
  9. 金错刀:“打工皇帝”唐骏的职场潜规则
  10. OverFeat(译)
  11. 金鹰dreamweaver视频教程下载地址
  12. 参考文献格式字号字体_论文字体字号格式要求是什么?
  13. 计算机学报在线阅读,计算机研究与发展计算机学报软件学报电子学报西安交通大学学报.doc...
  14. 计算机没有安装cad2006,win7系统不能正常安装cad2006的解决方法
  15. java 批量生成条形码,打包zip(springboot)
  16. 网络安全——kali_Linux基本命令大全
  17. python下载vip素材_Python素材下载爬虫,多线程rar下载爬虫
  18. 桌面运维工程师需要会哪些技能?主要是做什么的?
  19. 智能小区 安防技术详解及安防隐患杂谈
  20. 很牛的求职经历(转)

热门文章

  1. 软件测试团队口号及队名,霸气响亮的队名和口号押韵 有创意的团队口号
  2. jieba分词(1):入门案例
  3. 注册页面提交验证-密保问题实现
  4. 1088: 手机短号 (多实例)
  5. 1e9个兵临城下 - 容斥原理
  6. 项目中对微信昵称特殊字符的处理
  7. 顶点计划1——信通2018级学生上早自习缺勤率情况分析
  8. 开源网络模拟器资源统计列表
  9. CC2530的中断操作----按键控制led灯亮灭
  10. Excel 中根据一列查询其他列中的值