Qt模型视图代理之QListView使用的简单介绍

往期回顾:

Qt绘图与图形视图之Graphics View坐标系的简单介绍_graphics view 坐标系-CSDN博客

Qt模型视图代理之MVD(模型-视图-代理)概念的简单介绍-CSDN博客

Qt模型视图代理之QTableView应用的简单介绍-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界面的分离会更好。

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

相关推荐
强化学习与机器人控制仿真21 分钟前
RSL-RL:开源人形机器人强化学习控制研究库
开发语言·人工智能·stm32·神经网络·机器人·强化学习·模仿学习
百***480727 分钟前
【Golang】slice切片
开发语言·算法·golang
q***925135 分钟前
Windows上安装Go并配置环境变量(图文步骤)
开发语言·windows·golang
仟濹1 小时前
【Java 基础】面向对象 - 继承
java·开发语言
郝学胜-神的一滴1 小时前
Linux命名管道:创建与原理详解
linux·运维·服务器·开发语言·c++·程序人生·个人开发
2501_941623321 小时前
C++高性能网络服务器与epoll实战分享:大规模并发连接处理与事件驱动优化经验
开发语言·php
晚风(●•σ )1 小时前
C++语言程序设计——11 C语言风格输入/输出函数
c语言·开发语言·c++
likuolei2 小时前
XML 元素 vs. 属性
xml·java·开发语言
X***48962 小时前
C源代码生成器
c语言·开发语言
梁正雄2 小时前
2、Python流程控制
开发语言·python