一、QStringListModel
(1)功能:处理字符串列表的数据模型,可作为QListView的数据模型,在界面上显示和编辑字符串列表。
二、QStringListModel 类中的函数
1)、 QStringListModel(QObject *parent = Q_NULLPTR) //构造函数
QStringListModel(const QStringList &strings, QObject *parent = Q_NULLPTR)
2)、 void setStringList(const QStringList &strings)
把模型内部的字符串列表(即该模型存储数据的变量)设置为 strings,该模型将通知视
图,基础数据已更改。
3)、 QStringList stringList() const //返回存储数据的字符串列表(数据模型的最新数据)
以下函数为重新实现的 QAbstractItemModel 类中的相应函数(这些函数会使用到)。
4)、 virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)
把索引 index 处指定角色 role 所关联的数据设置为 value,若数据项被改变则发送
QAbstractItemModel::dataChanged()信号。
5)、 virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const
返回索引index处指定角色role所关联的数据。若索引无效,则返回一个无效的QVariant。
6)、 virtual Qt::ItemFlags flags(const QModelIndex &index) const
返回索引 index 所指项目的标志,标志详见 QAbstractItemModel 类。
7)、 insertRow(row)
功能:在row行之前插入一行,要在列表最后插入一行,参数row设置为列表当前的行数即可。
参数:row代表行号
8)、 virtual bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex())
9)、virtual bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex())
以上函数表示从行 row 开始 插入或删除 count 行,参数 parent 是可选的,仅用于与
QAbstractItemModel 保持一致,默认为空索引,表示在模型的顶层插入行。
10)、removeRow(index.row())
(1)功能:删除当前项
(2)参数:index表示当前模型索引
removeRows(row,count)
(1)功能:从行号row开始删除count行
(2)参数:row代表行号;count表示删除行的数目
11)、index(row,column,parentItem)
(1)功能:获取第row行号、column列号、或父项parentItem的模型索引
(2)参数:行号、列号和父项
12)、 virtual int rowCount(const QModelIndex &parent = QModelIndex()) const
返回模型中的行数,该值对应于模型内部字符串列中的项目数量。因为该模型是列表,
所有 parent 应是一个无效索引,若 parent 是一个有效索引,则该函数将返回 0。
13)、 virtual QModelIndex sibling(int row, int column, const QModelIndex &idx) const
virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder)
virtual Qt::DropActions supportedDropActions() const
以上函数详见父类 QAbstractItemModel 对应函数
三、例子
#include "widget.h" #include "ui_widget.h" #pragma execution_character_set("utf-8"); Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); QStringList theStrList; //保存初始 StringList theStrList<<"北京"<<"上海"<<"天津"<<"河北"<<"山东"<<"四川"<<"重庆"<<"广东"<<"河南"; //初始化 StringList theModel= new QStringListModel(this); //创建数据模型 //将一个字符串列表的内容:作为数据模型的初始数据内容 theModel->setStringList(theStrList); //为模型设置StringList,会导入StringList的内容 ui->listView->setModel(theModel); //为listView设置数据模型 //设置条目是否可编辑,以及如何进入编辑状态 //这里表示:在“双击\选择并单击”列表项后,进入编辑状态; ui->listView->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::SelectedClicked); } Widget::~Widget() { delete ui; } void Widget::on_listView_clicked(const QModelIndex &index) { //显示QModelIndex的当前项:行、列号 ui->LabInfo->setText(QString::asprintf("当前项:row=%d, column=%d", index.row(),index.column())); } //“恢复列表”的单击事件 响应函数 void Widget::on_btnIniList_clicked() { //重新载入theStrList的内容,初始化theModel的内容 QStringList theStrList; //保存初始 StringList theStrList<<"北京"<<"上海"<<"天津"<<"河北"<<"山东"<<"四川"<<"重庆"<<"广东"<<"河南"; //初始化 StringList theModel->setStringList(theStrList);//将一个字符串列表的内容:作为数据模型的初始数据内容 } //“清空文件”按钮的单击事件 void Widget::on_btnTextClear_clicked() { //清除plainTextEdit的文本 ui->plainTextEdit->clear(); } void Widget::on_btnTextImport_clicked() {// 显示数据模型的StringList QStringList tmpList; tmpList= theModel->stringList();//获取数据模型的最新数据StringList ui->plainTextEdit->clear(); //文本框清空 for (int i=0; i< tmpList.count();i++) ui->plainTextEdit->appendPlainText(tmpList.at(i)); //显示数据模型的StringList()返回的内容 } //清除列表 按钮 void Widget::on_btnListClear_clicked() {//清除ListView的所有项 theModel->removeRows(0, theModel->rowCount()); } //"添加项"按钮 void Widget::on_btnListAppend_clicked() { //添加一行 theModel->insertRow(theModel->rowCount()); //在尾部插入一“空行” QModelIndex index=theModel->index(theModel->rowCount()-1, 0);//获取最后一行 theModel->setData(index, "new item", Qt::DisplayRole);//设置显示文字 ui->listView->setCurrentIndex(index); //设置最后一行为 当前选中的行 } //“插入选”按钮 void Widget::on_btnListInsert_clicked() {//插入一行 QModelIndex index; index=ui->listView->currentIndex(); //当前 modelIndex theModel->insertRow(index.row()); //在当前行的前面插入一行 theModel->setData(index,"inserted item",Qt::DisplayRole); //设置显示文字 theModel->setData(index,Qt::AlignRight,Qt::TextAlignmentRole); //设置对齐方式,不起作用 ui->listView->setCurrentIndex(index); //设置当前选中的行 } //"删除当前项"按钮 void Widget::on_btnListDelete_clicked() {//删除当前行 QModelIndex index; index=ui->listView->currentIndex(); //获取当前 modelIndex theModel->removeRow(index.row()); //删除当前行 }