QStringListModel¶
代码来自异步社区 qt5.9开发指南() https://www.epubit.com/bookDetails?id=N25171
QStringListModel 继承自 QAbstractListModel。可以直接跟 listview 配合使用。
好处是数据和显示是分开的,两者更新一个会自动一起更新。
0.1 QStringListModel 添加数据 QListView添加QStringListModel¶
QStringListModel *theModel; //数据模型
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);
void setEditTriggers(EditTriggers triggers);
设置编辑方式
DoubleClicked双击编辑
SelectedClicked 当前选中后再单机编辑
1 QListView 点击事件¶
void Widget::on_listView_clicked(const QModelIndex &index) {
//显示QModelIndex的行、列号
ui->LabInfo->setText(QString("当前项:row=%1, column=%2")
.arg(index.row()).arg(index.column()));
}
2 数据初始化¶
void Widget::on_btnIniList_clicked() {
//重新载入theStrList的内容,初始化theModel的内容
QStringList theStrList; //保存初始 StringList
theStrList << "北京" << "上海" << "天津" << "河北" << "山东"
<< "四川" << "重庆" << "广东" << "河南"; //初始化 StringList
theModel->setStringList(theStrList);
}
3 清除ListView的所有项¶
void Widget::on_btnListClear_clicked() {
//清除ListView的所有项
theModel->removeRows(0, theModel->rowCount());
}
4 获取 QStringListModel 数据(这里可以明显体会到 mode/view 的好处¶
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()返回的内容
}
}
5 QStringListModel 增加插入删除¶
这里可以感受到,只要更改 mode,view就会自动更改。
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()); //删除当前行
}
6 完整代码¶
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
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) {
qDebug() << QString("当前项:row=%1, column=%2")
.arg(index.row()).arg(index.column());
//显示QModelIndex的行、列号
ui->LabInfo->setText(QString("当前项:row=%1, column=%2")
.arg(index.row()).arg(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()); //删除当前行
}