QT提供了model/view 结构来管理数据与展示数据。
model提供数据模型,view展示数据,delegate会对数据项进行渲染。model,view,delegate通过信号/槽机制通信。
QListView的使用比较方便,可选择的model比较多,既可以使用QStringListModel,也可以使用QStandardItemModel。
QT4/5中的继承关系如下图:
今天先学习一下QStringListModel。
对于QListView来说,要想使用QStringListModel,必要的操作就是绑定模型。
void QListView::setModel(QAbstractItemModel * model)
而对于
QStringListModel的初始化,QT提供了多种方式:
QStringListModel(const QStringList & strings, QObject * parent = 0);
void setStringList(const QStringList & strings);
我们这里使用第一种方式。
QListView的初始化:
QStringList strList<<"1"<<"22"<<"333"<<"4444";
m_model=new QStringListModel(strList);
ui->listView->setModel(m_model);
其中:m_model为类成员变量。
QStringListModel* m_model;需要注意的是,strList只用于QStringListModel的初始化,之后对model的操作不会同步到strList中去(实际上strList只是个局部变量,在初始化函数结束之后就销毁了。。。但是即便把strList换成成员变量也不会同步进去,除非自己同步操作,因为QStringListModel内部有一个自己的QStringList成员变量lst(源码中可见),这里的strList并没有与 QStringListModel关联起来。)
初始化完成之后,能对视图进行的操作就主要是增删改查了。
1.增加条目
增加一个条目需要三部操作:
1)model中新插入一行:
bool QStringListModel::insertRows(int row, int count, const QModelIndex & parent = QModelIndex())
2)model中定位插入点
QModelIndex QStringListModel::index(int row, int column = 0, const QModelIndex & parent = QModelIndex()) const
这一步会返回一个QModelIndex的对象供下一步使用,对与此对象,Qt的官方说明:
The QModelIndex class is used to locate data in a data model.
主要是定位数据在model中的位置。
3)model中设置数据
bool QStringListModel::setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole)
第一个参数就是上一步返回的结果了,第二个参数是我们要设置的值。
示例代码:
int row = ui->listView->currentIndex().row();
m_model->insertRows(row, 1);
QModelIndex index = m_model->index(row);
m_model->setData(index, "name");
第一行代码主要是从view中选择一个位置。
基本上有了上边的代码就可以新增加条目了,当然批量操作也是可以的,具体方法可见帮助文档。
2.删除条目
删除操作比较简单,只用调用model的删除函数即可:
bool QStringListModel::removeRows(int row, int count, const QModelIndex & parent = QModelIndex())
提供一个行号和删除行数,即可一键操作:
m_model->removeRows(ui.listView->currentIndex().row(), 1);
3.修改(编辑)条目
在运行状态下,在视图上直接按F2或者双击就可以直接编辑了。
对于按F2编辑,可以链接信号:
void pressed(const QModelIndex & index)
等用户编辑完成,按下enter键之后,修改数据:
void MainWindow::on_listView_pressed(const QModelIndex &index)
{
QVariant variant = m_model->data(index, Qt::DisplayRole); //获取当前选择的项的文本
QString name = variant.toString();
m_model->setData(index, name);
}
对于双击,可以链接信号:
void doubleClicked(const QModelIndex & index)
4.查询条目
Qt似乎没有提供相关操作,可行的方法如下:
通过函数:
QStringList QStringListModel::stringList() const
获取到所有的数据,然后遍历列表查找数据,view中的位置应该也与QStringList中的下标一致。
QListView的简单使用就到这了