2、视图类

视图的概述:

视图包含了模型中的数据项,并将它们呈现给用户。

视图通常管理从模型获取数据的整体布局,它们可以自己渲染独立的数据项,也可以使用委托来处理渲染和编辑。

视图的特性:

视图还可以处理项目间的导航,以及项目选择的某些方面(选择行为,选择模式)。

视图可以实现一些基本的用户接口特性,如上下文菜单和拖放等

视图可以提供默认的编辑实现,也可以和委托一起来提供一个自定义的编辑器。

QTableView和QTreeView,可以显示表头。

Qt提供了QListView、QTableView、QTreeView 三个现成的视图。

视图中的项目选择:

视图中被选择的项目的信息存储在一个QItemSelectionModel实例中,这样被选择的项目模型索引便保持在一个独立的模型中,与所有的视图都是独立的。

选择由选择范围指定,只需要记录每一个选择范围开始和结束的模型索引即可。

选择可以看作是在选择模型中保存的一个模型索引集合,最近的项目选择被称为当前选择。

1、当前项目和被选择的项目

视图中总是有一个当前项目和一个被选择的项目,两者是两个独立的状态。

当操作选择时,可以将QItemSeletionModel看作一个项目模型中所有项目的选择状态的一个记录。

2、使用选择模型

一个视图的选择模型可以使用selectionModel()函数获得,在多个视图之间可以使用setSelectionModel()函数来共享该选择模型。

视图类中提供了几个比较方便的函数来选择,如:

seletColumn()选择指定的一列项目;

selectCoumns()选择指定的多列项目;

selectRow()选择指定的一行项目;

selectRows()选择指定的多行项目;

下面看一个实例:

该实例,是表格模型的选择处理。
相关类的定义如下,实现了表格数据项的访问,数据项选择的处理

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
class QTableView;
class QItemSelection;
class QModelIndex;namespace Ui {class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();public slots:void getCurrentItemData();void toggleSelection();void updateSelection(const QItemSelection &selected,const QItemSelection &deselected);void changeCurrent(const QModelIndex &current, const QModelIndex &previous);private:Ui::MainWindow *ui;QTableView *tableView;QTableView *tableView2;
};#endif // MAINWINDOW_H

具体成员函数如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QStandardItemModel>
#include <QTableView>
#include <QDebug>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);QStandardItemModel *model = new QStandardItemModel(7, 4, this);for (int row = 0; row < 7; ++row) {for (int column = 0; column < 4; ++column) {QStandardItem *item = new QStandardItem(QString("%1").arg(row * 4 + column));model->setItem(row, column, item);}}tableView = new QTableView;tableView->setModel(model);setCentralWidget(tableView);// 获取视图的项目选择模型QItemSelectionModel *selectionModel = tableView->selectionModel();// 定义左上角和右下角的索引,然后使用这两个索引创建选择QModelIndex topLeft;QModelIndex bottomRight;topLeft = model->index(1, 1, QModelIndex());bottomRight = model->index(5, 2, QModelIndex());QItemSelection selection(topLeft, bottomRight);// 使用指定的选择模式来选择项目selectionModel->select(selection, QItemSelectionModel::Select);ui->mainToolBar->addAction(tr("now items"), this, SLOT(getCurrentItemData()));ui->mainToolBar->addAction(tr("change selection"), this, SLOT(toggleSelection()));connect(selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),this, SLOT(updateSelection(QItemSelection,QItemSelection)));connect(selectionModel, SIGNAL(currentChanged(QModelIndex,QModelIndex)),this, SLOT(changeCurrent(QModelIndex,QModelIndex)));// 多个视图共享选择tableView2 = new QTableView;tableView2->setWindowTitle("tableView2");tableView2->resize(400, 300);tableView2->setModel(model);tableView2->setSelectionModel(selectionModel);tableView2->show();
}MainWindow::~MainWindow()
{delete ui;delete tableView2;
}// 输出当前项目的内容
void MainWindow::getCurrentItemData()
{qDebug() << tr("Items now is:")<< tableView->selectionModel()->currentIndex().data().toString();
}// 切换选择的项目
void MainWindow::toggleSelection()
{QModelIndex topLeft = tableView->model()->index(0, 0, QModelIndex());QModelIndex bottomRight = tableView->model()->index(tableView->model()->rowCount(QModelIndex())-1,tableView->model()->columnCount(QModelIndex())-1, QModelIndex());QItemSelection curSelection(topLeft, bottomRight);tableView->selectionModel()->select(curSelection, QItemSelectionModel::Toggle);
}// 更新选择
void MainWindow::updateSelection(const QItemSelection &selected,const QItemSelection &deselected)
{QModelIndex index;QModelIndexList list = selected.indexes();// 为现在选择的项目填充值foreach (index, list) {QString text = QString("(%1,%2)").arg(index.row()).arg(index.column());tableView->model()->setData(index, text);}list = deselected.indexes();// 清空上一次选择的项目的内容foreach (index, list) {tableView->model()->setData(index, "");}
}// 改变当前项目
void MainWindow::changeCurrent(const QModelIndex &current,const QModelIndex &previous)
{qDebug() << tr("move(%1,%2) to (%3,%4)").arg(previous.row()).arg(previous.column()).arg(current.row()).arg(current.column());
}

C++ 的学习周期挺长的。Qt的学习周期也是很长,精通一门语言没有三五年的积累,很难说,就此可以独挡一面了。

Qt模型、视图解读之视图相关推荐

  1. Qt 模型视图框架解读之模型

    Qt 模型视图框架 前后阅读的好几遍,要不是项目中需要处理一些相对比较多的数据,这部分内容估计不会去急着去理解. 首先来了解下什么是模型和视图框架吧: 一般地:MVC 设计模式包括三个元素: 表示数据 ...

  2. Qt模型视图中的委托

    文章目录 1 初探QT模型视图中的委托 2 自定义委托 3 深度解析视图与委托 3.1 实例1:自定义视图显示方式 3.2 实例2:自定义视图显示方式提升用户体验 1 初探QT模型视图中的委托 首先来 ...

  3. Qt 模型视图编程的简单实例

    导言: 当遇到一个相对复杂的项目软件的时候,处理的数据量相对较大,这时候从软件设计的角度,一般都会考虑运用模型视图的架构. Qt关于MVC编程组成部分: 大体上,模型.视图架构中众多类可以分为3组:模 ...

  4. Qt 模型视图编程之表头设置

    背景 Qt 模型视图编程中模型定义了标准接口对数据进行访问,可根据需求继承对应的抽象模型类来实现自定义的数据模型.一个基本的数据模型至少要实现以下虚函数: ①.rowCount:行数,返回要显示多少行 ...

  5. Qt模型model、视图view、代理

    例子为qt5应用及实例第8章 MVC是一种与用户界面相关的设计模式.通过使用此模型,可以有效地分离数据和用户界面.MVC设计模式包含三要素:表示数据的模型(Model).表示用户界面的视图(View) ...

  6. Qt - 模型/视图编程(MVC编程自定义模型)

    模型/视图编程 Qt中的模型/视图架构用来实现大量的数据存储.处理及显示.MVC(Model-View-Controller)包括了3个组件:模型(Model)是应用对象,用来表示数据:视图(View ...

  7. Qt开发技术:图形视图框架(二)场景QGraphicsScene、QGraphicsItem与QGraphicsView详解

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/117660217 长期持续带来更多项目与技术分享,咨询请 ...

  8. Java基础之在窗口中绘图——使用模型/视图体系结构在视图中绘图(Sketcher 1 drawing a 3D rectangle)...

    控制台程序. 在模型中表示数据视图的类用来显示草图并处理用户的交互操作,所以这种类把显示方法和草图控制器合并在一起.不专用于某个视图的通用GUI创建和操作在SketcherFrame类中处理. 模型对 ...

  9. 【深度学习模型】智云视图中文车牌识别源码解析(二)

    [深度学习模型]智云视图中文车牌识别源码解析(二) 感受 HyperLPR可以识别多种中文车牌包括白牌,新能源车牌,使馆车牌,教练车牌,武警车牌等. 代码不可谓不混乱(别忘了这是职业公司的准产品级代码 ...

最新文章

  1. 剑指offer:面试题09. 用两个栈实现队列
  2. php中的魔术函数以及魔术常量
  3. 2021HDU多校9 - 7073 Integers Have Friends 2.0(随机数)
  4. 0001-Two Sum(两数之和)
  5. SAP UI5 Extension getCustomProperties
  6. html-body相关标签
  7. 第十九讲:职责链模式
  8. php获取当地时间 time zone
  9. 超详细的jenkins持续集成工作原理、功能、部署方式等介绍
  10. Android事件分发机制(一)
  11. ios版的chrome如何保存网页为PDF
  12. html5适合安卓的字体,在安卓中切换h5页面中的字体
  13. python发邮件给多个人发送消息_python发送邮件(带附件)、发送给多人、抄送给多人的示例...
  14. PDF,图片转word
  15. 取供应商类型所在的快码
  16. Transformer Cognos操作
  17. java基于springboot足球联赛管理系统
  18. 《杰克韦尔奇自传》读后感
  19. 化工热力学(第三版)课后答案完整版-朱
  20. 戴尔r730服务器性能,磁盘系统IO性能测试:极致稳定_戴尔 PowerEdge R730 机架式服务器(Xeon E5-2603 V3/8GB/1.2TB)_服务器x86服务器-中关村在线...

热门文章

  1. YUM更换源(1)--yum找不到安装包 2013-01-18 20:08 8687人阅读 评论(1) 收藏 举报 分类: linux(70) 公司提供的CentOS VM中,/etc/yum.r
  2. 【编程】位(bit)、字节(byte)和字(word)的区别
  3. [云炬创业基础笔记] 第四章测试15
  4. [C++学习笔记](double*)malloc(n * sizeof(double));
  5. 配置nginx/apache的404状态码来申请百度闭站保护
  6. 一步一步教你如何将 yolov3/yolov4 转为 caffe 模型
  7. const 常量_软件特攻队|const常量,不一样的新玩法
  8. NHibernate入门hello world
  9. 多次Jquery引发head.insertBefore( script, head.firstChild );
  10. ASP.NET应用程序设计的10大技巧