专栏首页Linux驱动25.QT-模型视图

25.QT-模型视图

模型视图设计模式的核心思想

  • 使模型(数据)与视图(显示)相分离
  • 模型只需要对外提供标准接口存取数据,无需数据如何显示
  • 视图只需要自定义数据的显示方式,无需数据如何组织存储
  • 当数据发生改变时,会通过信号通知视图
  • 当用户与视图进行交互时,会通过信号向模型发送交互信息 

在QT中提供了以下几种预定义模型:

其中QStandardItemModel的常见子类有:

  • QAbstractListModel:用来创建一维列表模型
  • QStandardItemModel:用来存储定制数据的通用模型
  • QAbstractTableModel: 用来创建二维列表模型

常用的视图类层次结构,如下所示:

在Qt中,不管模型以什么结构组织数据,都必须为每个数据提供不同的索引值,使得视图能通过索引值访问模型中的具体数据

以QTreeView视图为例

    QWidget w;

    QFileSystemModel  model(&w);              //定义文件系统模型

    QTreeView   treeView(&w);                 //定义树形显示视图

    treeView.resize(600,300);

    model.setRootPath(QDir::currentPath()); //设置根目录

    treeView.setModel(&model);          //连接模型与视图

    treeView.setRootIndex(model.index(QDir::currentPath()));
    // setRootInedex():设置树形显示视图的数据索引,以当前目录为根部显示
    // QModelIndex index(QDir::currentPath()):以当前目录为模型项索引

    w.show();

效果:

其中index()是个重载函数,用来获取QModelIndex 索引值,完整的index()函数如下所示:

QModelIndex QAbstractItemModel::index ( int row, int column, const QModelIndex & parent = QModelIndex() );
       //返回指定的row(行)、column(列)、parent(父索引)引所在的索引值

对于不同的模型视图而言,row(行)、column(列)、parent(父索引)的效果如下所示:

以QFileSystemModel为例:

也可以通过index索引值来查找数据,以QFileSystemModel模型为例, 与index相关的成员函数有:

QIcon     fileIcon ( const QModelIndex & index );    //通过索引值获取文件图标
QFileInfo fileInfo ( const QModelIndex & index );    //通过索引值获取文件信息
QString   fileName ( const QModelIndex & index ) ;   //通过索引值获取文件名
QString   filePath ( const QModelIndex & index ) ;  //通过索引值获取文件路径
bool isDir ( const QModelIndex & index ) ;          //通过索引值,判断是否是目录

int   columnCount ( const QModelIndex & parent = QModelIndex() ) ; 
//通过索引值获取当前列数

int   rowCount ( const QModelIndex & parent = QModelIndex() ) ; //通过索引值获取行数

QModelIndex parent ( const QModelIndex & index ) ; //通过索引值获取其父节点的索引值

QVariant  data ( const QModelIndex & index, int role = Qt::DisplayRole ) ;
                                                 //通过索引值获取模型数据

bool setData ( const QModelIndex & idx, const QVariant & value, int role = Qt::EditRole );
                                           //通过索引值设置模型数据

其中data ()setData() 函数的参数role 是模型数据角色

role 数据角色

当role值不同时,则显示在视图上的方式也会不同

对于role角色,常用的值有:

  • Qt::DisplayRole             0          以文本方式显示数据(QString)
  • Qt::DecorationRole       1         将数据作为图标来装饰(QIcon,QPixmap)
  • Qt::EditRole                   2          可编辑的数据信息显示(QString)
  • Qt::ToolTipRole             3          作为工具提示显示(QString)
  • Qt::StatusTipRole          4         作为状态栏中显示的数据(QString)
  • Qt::WhatsThisRole        5         作为帮助信息栏中显示的数据(QString)
  • Qt::FontRole                   6        设置字体(QFont)
  • Qt::TextAlignmentRole   7       设置模型数据的文本对齐(Qt::AlignmentFlag)
  • Qt::BackgroundRole      8        设置模型数据的背景色(QBrush)
  • Qt::ForegroundRole      9         设置模型数据的前景色,比如字体(QBrush)

以QTableView为例

    QWidget w;
    QTableView view(&w);
    QStandardItemModel  model(&w);
    view.setModel(&model);          //设置视图的模型

    QStandardItem itemA;

    /*设置text*/
    itemA.setData("A",Qt::DisplayRole);

    /*设置图标*/
    QPixmap pix(":user.png");
    pix = pix.scaled(24,24,Qt::KeepAspectRatio);
    itemA.setData(pix,Qt::DecorationRole);

    /*设置渐变背景色*/
    QLinearGradient  back(0,0,100,30);
    back.setColorAt(0,Qt::white);
    back.setColorAt(0.5,Qt::green);
    back.setColorAt(1,Qt::blue);
    itemA.setData(QBrush(back),Qt::BackgroundRole);

    model.setItem(0,0,&itemA);
    model.setItem(0,1,new QStandardItem(QIcon(pix),"B"));
    model.setItem(1,0,new QStandardItem(QIcon(pix),"C"));

    w.show();

效果:

QTableView详细使用请参考:24.QTableView函数使用,右击菜单实现

未完待续,接下来开始学习模型视图中的委托

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 30.QT-渐变之QLinearGradient、 QConicalGradient、QRadialGradient

    张诺谦
  • 22.Linux-块设备驱动之框架详细分析(详解)

    本节目的:     通过分析块设备驱动的框架,知道如何来写驱动 1.之前我们学的都是字符设备驱动,先来回忆一下 字符设备驱动: 当我们的应用层读写(read()...

    张诺谦
  • 1.驱动程序概念介绍

    u-boot的任务是启动内核,内核的任务是启动应用程序 ,应用程序会涉及很多文件和硬件操作(当然不会直接操作硬件),比如读写文件,点灯、获取按键值。 比如对于控...

    张诺谦
  • Hexo博客添加一言

    动漫也好、小说也好、网络也好,不论在哪里,我们总会看到有那么一两个句子能穿透你的心。我们把这些句子汇聚起来,形成一言网络,以传递更多的感动。如果可以,我们希望我...

    YangAir
  • Java锁机制了解一下

    Java3y
  • bootstrap nav导航栏 跟随页面滚动 常用样式

    navbar-static-top <nav class="navbar navbar-default navbar-static-top" role="na...

    用户5760343
  • bootstrap nav 黑色样式导航栏

    黑色样式导航栏 <nav class="navbar navbar-inverse" role="navigation"> <div class="cont...

    用户5760343
  • 第六章:Shiro的Realms——深入浅出学Shiro细粒度权限开发框架

    Realms概述 概述   Realm 是一个能够访问应用程序特定的安全数据(如用户、角色及权限)的组件。   Realm 通常和数据源是一对一的对应关系,如...

    MonroeCode
  • 第六章:Shiro的Realms——深入浅出学Shiro细粒度权限开发框架

      Realm 是一个能够访问应用程序特定的安全数据(如用户、角色及权限)的组件。

    MonroeCode
  • 鲍忠铁:深度商业分析的7大基石

    本文为TalkingData首席金融行业专家在CDAS2016大数据金融分论坛上的分享,已经过嘉宾审核,整理出来,以飨读者。 今天跟大家分享三方面的内容,一个是...

    CDA数据分析师

扫码关注云+社区

领取腾讯云代金券