往期回顾:
Qt绘图与图形视图之Graphics View坐标系的简单介绍_graphics view 坐标系-CSDN博客
Qt模型视图代理之QListView使用的简单介绍
一、最终效果
功能实现很简单明确,就是用户可以在这个QStringListModel数据模型里增加项,随时修改、插入、删除、回显数据
二、主要实现
1、初始化并设置数据模型
在构造函数中初始化界面,创建一个QStringListModel并将其设置为QListView的数据模型。
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle(u8"QListView使用教程");
QStringList strList;
strList << u8"北京" << u8"上海" << u8"深圳" << u8"广东"
<< u8"南京" << u8"苏州" << u8"西安";
//创建数据模型
m_pStringListModel = new QStringListModel(this);
//为模型设置StringList,会导入StringList的内容
m_pStringListModel->setStringList(strList);
//为listView设置数据模型
ui->listView->setModel(m_pStringListModel);
//设置listview编辑属性
//双击与选择
//ui->listView->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::SelectedClicked);
}
2、初始化右键菜单
初始化右键菜单,并连接删除操作的信号槽。
initMenu();
//listview右键菜单
ui->listView->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->listView, &QListView::customContextMenuRequested, this, &Widget::on_showRightMenu);
在initMenu()方法里实现右键点击QListView时显示右键菜单,并实现了删除选中项的功能。
void Widget::initMenu()
{
m_pMenu = new QMenu(ui->listView);
QAction *pAc1 = new QAction(u8"删除", ui->listView);
QAction *pAc2 = new QAction(u8"插入", ui->listView);
QAction *pAc3 = new QAction(u8"置顶", ui->listView);
QAction *pAc4 = new QAction(u8"排到最后", ui->listView);
m_pMenu->addAction(pAc1);
m_pMenu->addAction(pAc2);
m_pMenu->addAction(pAc3);
m_pMenu->addAction(pAc4);
//注意在exec前链接信号槽,因为exec会阻塞主线程,
//如果connect写在exec代码之后,信号槽将无法链接
connect(pAc1, &QAction::triggered, this, &Widget::OnActionDelete);
}
3、实现增删改查功能
实现了添加、删除、插入、显示数据和清除所有数据等操作的槽函数。
3.1、添加item
是直接在尾部最后一行添加,同时小细节,设置新添加的行选择
void Widget::on_btnAddItem_clicked()
{
//在尾部插入一空行, 不添加就把最后一行给替换了
m_pStringListModel->insertRow(m_pStringListModel->rowCount());
//获取最后一行
QModelIndex index = m_pStringListModel->index(m_pStringListModel->rowCount()-1, 0);
m_pStringListModel->setData(index,"new item", Qt::DisplayRole); //设置显示文字
//设置新添加的行选中
ui->listView->setCurrentIndex(index);
}
3.2、删除选中的项
获取索引直接删除即可
void Widget::on_btnDeleteItem_clicked()
{
//获取当前选中的modelIndex
QModelIndex index = ui->listView->currentIndex();
//删除当前行
m_pStringListModel->removeRow(index.row());
}
3.3、插入一项
void Widget::on_btnInsert_clicked()
{
//获取选中 model Index
QModelIndex index=ui->listView->currentIndex();
//在当前行的前面插入一行
m_pStringListModel->insertRow(index.row());
m_pStringListModel->setData(index,"inserted item",Qt::DisplayRole);
ui->listView->setCurrentIndex(index);
}
3.4、回显listview数据
先清空文本框内容,然后再显示数据模型返回的内容
void Widget::on_btnReshow_clicked()
{
//获取数据模型的StringList
QStringList tmpList = m_pStringListModel->stringList();
ui->textEdit->clear(); //文本框清空
for (int i=0; i<tmpList.count();i++)
{
//显示数据模型的StringList()返回的内容
ui->textEdit->append(tmpList.at(i));
}
}
3.5、清除所有数据
直接按索引从0删到底就行
void Widget::on_btnClearAllData_clicked()
{
m_pStringListModel->removeRows(0, m_pStringListModel->rowCount());
}
4、点击项显示行列号
void Widget::on_listView_clicked(const QModelIndex &index)
{
ui->textEdit->clear(); //文本框清空
//显示QModelIndex的行、列号
ui->textEdit->append(QString::asprintf(u8"当前项:row=%d, column=%d",
index.row(),index.column()));
}
以上就是Qt里模型视图代理之QListView使用的简单介绍。思路不难,重点在于理解MVD模型-视图-代理,这里我不用MVD也能做出来同样的效果,但是用模型视图代理实现数据和UI界面的分离会更好。
都看到这里了,点个赞再走呗朋友~
加油吧,预祝大家变得更强!