我的QT Creator学习笔记(三十一)——模型/视图编程之视图类

在模型视图架构中,视图包含了模型中的数据项,并将他们呈现给用户,而数据的表示方法可能与

参考文献:《Qt Creator 快速入门》第三版 霍亚飞编著

底层存储数据项的数据结构完全不同,这种内容与表现的分离之所以能够实现,是因为使用了QAbstractItemModel提供了一个标准模型接口,还有QAbstractItemView提供的一个标准视图接口,以及使用了模型索引提供了一种通用的方法来表示数据。

除了呈现数据,视图还处理项目间的导航,以及项目选择的某些方面。 

处理项目选择

在视图中被选择的项目的信息存储在一个QItemSelectionModel实例中,这样被选择项目的模型索引便保持在一个独立的模型中,与所有的视图都是独立的。选择可以看作是在选择模型中保存的一个模型索引集合,最近的项目选择被成为当前选择。

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

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

 

当前项选择项
只能有一个当前项目可以有多个被选择的项目
使用键盘导航键或者鼠标按键可以改变当前项目项目是否处于被选择状态取决于几个预先定义好的模式,例如,单项选择,多重选择等
按下F2键或者双击鼠标都可以编辑当前项目

 

选择项目可以指定一个范围来一起被使用
当前项目会显示焦点矩形被选则的项目会使用矩形来表示

2、使用选择模型

标准视图类中提供了默认的选择模型,可以在大多数应用中直接使用。属于一个视图类的选择模型可以使用这个视图的selectionMode()函数获得,而且可以在多个视图之间使用setSelectionModel()函数来共享该选择模型。

例子代码

新建Qt Widget应用,项目名称为myselection,其他保持默认不变。然后在mainwindow.h文件中添加类的前置声明如下

class QTableView;

再添加两个prite对象,如下。这里添加两个是为了看到两个视图共享选择模型的效果。

    QTableView* tableView;
    QTableView* tableView2;

在mainwindow.cpp文件添加头文件

如下

#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 colum=0;colum<4;colum++)
        {
            QStandardItem* item=new QStandardItem(QString("%1").arg(row*4+colum));
            model->setItem(row,colum,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);

    //共享选择项目
    tableView2=new QTableView;
    tableView2->setWindowTitle("tableView2");
    tableView2->resize(400,300);
    tableView2->setModel(model);
    tableView2->setSelectionModel(selectionModel);
    tableView2->show();

}

运行效果如下

当改变一个视图中的选择项目时,另一个视图中也会改变

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值