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界面的分离会更好。

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

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

相关推荐
灯澜忆梦7 小时前
GO_并发编程---定时器
开发语言·后端·golang
-银雾鸢尾-7 小时前
C#中的StringBuilder相关方法
开发语言·c#
-银雾鸢尾-8 小时前
C#中结构体与类的区别;抽象类与接口的区别
开发语言·c#
大模型码小白9 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
段一凡-华北理工大学11 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
Ljwuhe11 小时前
C++——多态
开发语言·c++
心平气和量大福大12 小时前
C#-WPF-Window主窗体
开发语言·c#·wpf
从零开始的代码生活_13 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
云小逸13 小时前
【C++ 第七阶段:模板、泛型编程与工程综合详解】
开发语言·c++
Quz13 小时前
QML 信号与槽:直接绑定与跨文件通信
qt·编程语言·设计