模型Model:字符串列表模型QStringListModel
作者:mmseoamin日期:2024-01-19

一、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 对应函数

三、例子

模型Model:字符串列表模型QStringListModel,第1张

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