轉載自: 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 模型所帶來的一個便捷之處。
新聞熱點
疑難解答