转载自:
QStringListModel是最简单的模型类,具备向视图提供字符串数据的能力。QStringListModel 是一个可编辑的模型,可以为组件提供一系列字符串作为数据。我们可以将其看作是封装了 QStringList 的模型。
QStringList 是一种很常用的数据类型,实际上是一个字符串列表(也就是 QList< QString>)。既然是列表,它也就是线性的数据结构,因此,QStringListModel 很多时候都会作为 QListView 或者 QComboBox 这种只有一列的视图组件的数据模型。
示例:
#include "widget.h"
#include "ui_widget.h"
#include <qDebug>
#include <QMessageBox>
Widget::Widget(QWidget *parent) :
QWidget(parent)
{
QStringList data;
data << "Letter A" << "Letter B" << "Letter C";
model = new QStringListModel(this);
model->setStringList(data);
listView = new QListView(this);
listView->setModel(model);
QHBoxLayout *btnLayout = new QHBoxLayout;
QPushButton *insertBtn = new QPushButton(tr("insert"), this);
connect(insertBtn, SIGNAL(clicked()), this, SLOT(on_insertData()));
QPushButton *delBtn = new QPushButton(tr("Delete"), this);
connect(delBtn, SIGNAL(clicked()), this, SLOT(on_deleteData()));
QPushButton *showBtn = new QPushButton(tr("Show"), this);
connect(showBtn, SIGNAL(clicked()), this, SLOT(on_showData()));
btnLayout->addWidget(insertBtn);
btnLayout->addWidget(delBtn);
btnLayout->addWidget(showBtn);
QVBoxLayout *mainLayout = new QVBoxLayout(this);
mainLayout->addWidget(listView);
mainLayout->addLayout(btnLayout);
setLayout(mainLayout);
}
void Widget::on_insertData()
{
bool isOK;
QString text = QInputDialog::getText(this,"Input",
"Plase input",
QLineEdit::Normal,
"You are inserting",
&isOK);
//选定行之后插入
if(isOK){
int row = listView->currentIndex().row();
qDebug()<<row;
model->insertRows(row+1,1);
QModelIndex index = model->index(row+1);
model->setData(index,text);
listView->setCurrentIndex(index);
listView->edit(index);
}
//选定行之前插入
// if(isOK){
// QModelIndex currIndex = listView->currentIndex();
// model->insertRows(currIndex.row(),1);
// model->setData(currIndex,text);
// listView->edit(currIndex);
// }
}
void Widget::on_deleteData()
{
if(model->rowCount() > 0){
model->removeRow(listView->currentIndex().row());
}
}
void Widget::on_showData()
{
QStringList data = model->stringList();
QString str;
foreach(QString s,data)
str += s;
QMessageBox::information(this,"Outpot",str);
}
Widget::~Widget()
{
}
从示例中可以看到,几乎所有操作都是针对模型的,也就是说,我们直接对数据进行操作,当模型检测到数据发生了变化,会立刻通知视图进行刷新。这样一来,就可以把精力集中到对数据的操作上,而不用担心视图的同步显示问题。这正是 model/view 模型所带来的一个便捷之处。