Qt学习之路(42): QStringListModel

Qt——自定义Model 众所周知,Qt提供了一套Model/View框架供开发者使用,Model用来提供数据, View则用来提供视觉层的显示。实际上这是一套遵循MVC设计模式的GUI框架,因为Qt还提供了默认的Delegate作为Controller来作为控制器。 阅读详情
今天开始我们要看看Qt的model-view类了。正如前面说的那样,之前三节的item class类只是Qt为了方便我们使用而封装了的一些操作。比起真正的model-view类来,那些类更易于使用,但是功能也会更简单,并且缺少实时性的支持,比如我们并不方便实现插入、删除等一些常见操作。而现在我们要说的model-view类使用起来可能会复杂一些,但是功能强大,并且在model更新时会自动更新view,而model多是一些数据集合,因此比较便于操作。
 
model-view类中,view大致有三种:list、tree和table,但是model千奇百怪,不同的业务,甚至同样的业务不同的建模都会有不同的model。为了方便使用,Qt提供了一些预定义好的model供我们使用。QStringListModel是其中最简单的一种。
 
顾名思义,QStringListModel就是封装了QStringList的model。QStringList是一种很常用的数据类型,它实际上是一个字符串列表。我们可以想象,对于一个list来说,如果提供一个字符串列表形式的数据,就应该能够把这个数据展示出来。因为二者是一致的:QStringList是线性的,而list也是线性的。所以,QStringListModel很多时候都会作为QListView的model。
 
下面我们来看怎么使用它们。比起前面的QListWidget,这里要使用两个类:QStringListModel和QListView,并且还有一些辅助类。不过你可以看到,即便这样复杂的工作,我们的代码也不会很多的:
 
mylistview.h
#ifndef MYLISTVIEW_H 
#define MYLISTVIEW_H 
 
#include <QtGui> 
 
class MyListView :  public QWidget 
{ 
        Q_OBJECT 
public: 
        MyListView(); 
 
private: 
        QStringListModel *model; 
        QListView *listView; 
 
private slots: 
         void insertData(); 
         void deleteData(); 
         void showData(); 
}; 
 
#endif  // MYLISTVIEW_H
 
mylistview.cpp
#include  "mylistview.h" 
 
MyListView::MyListView() 
{ 
        model =  new QStringListModel( this); 
        QStringList data; 
        data <<  "Letter A" <<  "Letter B" <<  "Letter C"; 
        model->setStringList(data); 
        listView =  new QListView( this); 
        listView->setModel(model); 
        QHBoxLayout *btnLayout =  new QHBoxLayout; 
        QPushButton *insertBtn =  new QPushButton(tr( "insert"),  this); 
        QPushButton *delBtn =  new QPushButton(tr( "Delete"),  this); 
        QPushButton *showBtn =  new QPushButton(tr( "Show"),  this); 
        btnLayout->addWidget(insertBtn); 
        btnLayout->addWidget(delBtn); 
        btnLayout->addWidget(showBtn); 
        QVBoxLayout *mainLayout =  new QVBoxLayout( this); 
        mainLayout->addWidget(listView); 
        mainLayout->addLayout(btnLayout); 
         this->setLayout(mainLayout); 
 
        connect(insertBtn, SIGNAL(clicked()),  this, SLOT(insertData())); 
        connect(delBtn, SIGNAL(clicked()),  this, SLOT(deleteData())); 
        connect(showBtn, SIGNAL(clicked()),  this, SLOT(showData())); 
} 
 
void MyListView::insertData() 
{ 
         bool isOK; 
        QString text = QInputDialog::getText(NULL,  "Insert",  "Please input new data:", 
                                                                                 QLineEdit::Normal,  "You are inserting new data.", &isOK); 
         if(isOK) { 
                 int row = listView->currentIndex().row(); 
                model->insertRows(row, 1); 
                QModelIndex index = model->index(row); 
                model->setData(index, text); 
                listView->setCurrentIndex(index); 
                listView->edit(index); 
        } 
} 
 
void MyListView::deleteData() 
{ 
         if(model->rowCount() > 1) { 
                model->removeRows(listView->currentIndex().row(), 1); 
        } 
} 
 
void MyListView::showData() 
{ 
        QStringList data = model->stringList(); 
        QString str; 
         foreach(QString s, data) { 
                str += s +  "\n"; 
        } 
 
        QMessageBox::information( this,  "Data", str); 
} 
 
 
来看看我们的代码吧。
 
首先我们创建一个QStringListModel的对象。然后创建一个QStringList对象,并且把这个对象设置为model的数据。此时,这个model已经拥有数据了。然后,我们创建一个QListView的对象,并把model设置为它的model。后面是三个按钮的创建以及信号槽的连接,这里就不再赘述。
 
先来运行一下看看结果吧!
 
我们只是把QStringListModel设置为QListView的model,QListView就已经可以把model里面的数据展示出来了。下面我们看看增、删、改的操作。
 
先来看增加数据的操作。这部分是在代码中的insertData()函数实现的。先把那个函数拿出来看看:
 
void MyListView::insertData() 
{ 
         bool isOK; 
        QString text = QInputDialog::getText(NULL,  "Insert",  "Please input new data:", 
                                                                                 QLineEdit::Normal,  "You are inserting new data.", &isOK); 
         if(isOK) { 
                 int row = listView->currentIndex().row(); 
                model->insertRows(row, 1); 
                QModelIndex index = model->index(row); 
                model->setData(index, text); 
                listView->setCurrentIndex(index); 
                listView->edit(index); 
        } 
}
 
我们使用QInputDialog::getText()函数要求用户输入数据。这部分在前面讲过,这里也不再赘述。如果用户点击了OK按钮,首先,我们使用listView()->currentIndex()函数,获取QListView当前行。注意,这个函数的返回值是一个QModelIndex类型。这个类我们以后再说,只要知道这个类保存了三个重要的数据:行、列以及属于哪一个model。我们调用其row()函数获得行,这个返回值是一个int,也就是第几行。然后model插入一行。insertRows()函数签名如下:
 
bool insertRows( int row,  int count,  const QModelIndex &parent = QModelIndex());
 
这个函数原本是QAbstractListModel类的函数,而QStringListModel把它覆盖了。所以我们会发现它还需要另外的一个参数。我们调用 insertRows(row, 1); ,所谓1就是指插入1条数据,而前面又把row保存成当前行,因此,这行语句实际上是在当前的 row 行插入 count 行,这里的 count = 1。然后我们使用model的index()函数获取当前行的QModelIndex对象,使用setData()函数把我们用QInputDialog接受的数据插入。 这里其实是一个冗余的操作,因为用currentIndex()函数已经获取当前行了。这么写仅仅是为了展示如何使用这个函数。不过,你知道了insertRow()函数,就可以很容易的做出插入空白行的效果了。然后我们把当前行设为新插入的一行,并调用edit()函数,这个函数使得这一行可以被编辑。就这样,我们向model插入了数据。
 
然后来看删除数据的操作:
 
void MyListView::deleteData() 
{ 
         if(model->rowCount() > 1) { 
                model->removeRows(listView->currentIndex().row(), 1); 
        } 
}
 
使用model的removeRows()函数可以轻松的完成这个功能。这个函数同前面所说的insertRows()很类似,就不再多说了。需要注意的是,我们用rowCount()函数判断了一下,要求最终始终保留1行。这是因为如果你把数据全部删除,你就不能再插入数据了,因为那时侯按照我们所写的插入逻辑就不对了。所以,前面所说的插入操作实际上还需要再详细考虑。
 
最后那个showData()仅仅为了查看model的数据,没有什么要说的东西。你可以在insert或者remove完成后查看一下model里面的数据是不是真的被修改了。
 
关于QStringListModel就说这么多。你可以看到,我们的几乎所有操作都是针对model的,也就是说,我们直接针对的是数据,而model侦测到数据发生了变化,会立刻通知view刷新。这样,我们就可以把精力集中到对数据的操作上,而不用担心view的同步等操作。这也是model-view模型的一个便捷之处。

本文出自 “豆子空间” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/265057

QListView使用学习--QStringListModel的使用 QT提供了model/view 结构来管理数据与展示数据。 model提供数据模型,view展示数据,delegate会对数据项进行渲染。model,view,delegate通过信号/槽机制通信。 QListView的使用比较方便,可选择的model比较多,既可以使用QStringListModel,也可以使用QStandardItemModel。 QT4/5中的继承关系如下图: 阅读详情

相关推荐

Qt QStringListModel用法详解

QStringListModel用于处理字符串列表的数据模型,它可以作为 QListView 的数据模型,在界面上显示和编辑字符串列表。 QStringListModel 的 setStringList() 函数可以初始化数据模型的字符串列表的内容,stringList() 函数返回数据模型内的字符串列表,在关联的 ListView 组件里编辑修改数据后,数据都会及时更新到数据模型内的字符串列表里。 QStringListModel 提供编辑和修改字符串列表数据的函数,如 insertRows()、rem.

公知了 3777

QT5知识:字符串列表QStringListModel

QStringListModel提供了所有可编辑模型的标准函数,将字符串列表中的数据存储为一个一列多行的模型。换个说法,符号串的列表无法直接传入QListView对象和QComboBox,需要QStringListModel做为中间传递过程。...

gongdiwudu的专栏 7390

Qt模型视图编程:QStringListModel与QListView进阶应用指南

模型-视图编程是现代GUI开发的核心设计模式,通过数据与显示的分离实现高效界面开发。Qt框架提供了完整的模型视图架构,其中QStringListModel作为标准字符串列表模型,实现了QAbstractItemModel接口,能够自动处理数据变更通知和视图同步。这种设计在需要频繁更新数据或多视图展示的场景中具有显著优势,特别是在日志查看器、文件管理器等应用中。QListView作为视图组件支持多种布局模式和编辑控制,结合QSortFilterProxyModel可实现过滤排序功能。本文通过QStringLi

weixin_34218890的博客 1523

QML学习十六:ListView的简单使用(使用C++ Model)

QML学习

5042

Qt QStringListModel与QListView数据绑定实战指南

模型/视图架构是现代GUI开发中的核心设计模式,通过数据与显示的分离实现高效的数据管理。Qt框架中的模型/视图架构基于MVC原理,将数据存储、业务逻辑和界面展示解耦,提升代码的可维护性和复用性。QStringListModel作为Qt提供的基础字符串列表模型,结合QListView视图组件,为C++ GUI应用提供了轻量级的数据绑定方案。这种组合特别适合需要动态更新数据的场景,如日志显示、文件列表和消息记录等常见应用。通过信号槽机制实现数据变化的自动同步,开发者可以专注于业务逻辑而无需手动维护界面状态。对于

weixin_33985679的博客 401

QT的ListModel详解

其中,rowCount()返回数据项的数量,data()返回指定索引的数据,roleNames()定义了数据项的角色。在该示例中,代理项为一个高度为40的矩形框,其中包含一个居中显示的文本组件,文本内容为数据项的name属性。在上面的代码中,我们创建了一个QQmlApplicationEngine对象,并将自定义的ListModel对象myModel注册到了QML引擎的上下文中。通过创建自定义的ListModel类,并将其暴露给QML引擎,我们可以在QML中轻松地展示和操作数据。如有任何疑问,请随时提问。

CodeVorter的博客 610

QT 数据模型结构学习 :QStringListModel

代码来自异步社区 qt5.9开发指南() https://www.epubit.com/bookDetails?id=N25171   QStringListModel 继承自 QAbstractListModel。可以直接跟listview配合使用。   好处是数据和显示是分开的,两者更新一个会自动一起更新。 1. QStringListModel 添加数据 QListView添加QS...

Beyond欣 968

Qt QStringListModel详解

QStringListModel QStringListModel用于处理字符串列表的数据模型,它可以作为 QListView 的数据模型,在界面上显示和编辑字符串列表。 QStringListModel 的 setStringList() 函数可以初始化数据模型的字符串列表的内容,stringList() 函数返回数据模型内的字符串列表,在关联的 ListView 组件里编辑修改数据后,数据都会及时更新到数据模型内的字符串列表里。 QStringListModel 提供编辑和修改字符串列表数据的函.

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 4033

自学QT之QStringListModel

当然前提是已经在头文件中生命了一个指针是QStringListModel类的model指针。 #include "dialog.h" #include "ui_dialog.h" Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(this); m

CN小黑 1173

PlutoSDR在matlab中的环境配置(包括驱动和硬件支持包)

双击下载到的驱动,除了点击接受协议和设置安装路径,其他只要点击下一步或者安装即可。登录或者注册你的账号,选择你的matlab版本(这里我的是2023b),点击下一步。设置安装路径,并选择我接受,点击下一步,即可安装完成,并在安装路径中得到。完成后,打开设备管理器,在端口和通用串行总线设备一栏,即可看见下图。点击进入,选择相应的系统安装包,这里我选择的Windows。可看到我们要安装的Pluto支持包,安装即可。右击桌面matlab,选择打开文件所在位置。右上角搜索pluto,选择并点击下一步。

weixin_53160338的博客 4864

LEF文件介绍及其生成

介绍LEF文件及其生成方法

weixin_43249158的博客 3万+
上一篇: Qt学习之路(41): QTableWidget
下一篇: Qt学习之路(43): QDirModel
flowingFire2012
博客等级 码龄14年 6粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值