一、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()); //删除当前行
}