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

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

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

相关推荐
玩电脑的辣条哥2 小时前
Python如何播放本地音乐并在web页面播放
开发语言·前端·python
ll7788114 小时前
LeetCode每日精进:20.有效的括号
c语言·开发语言·算法·leetcode·职场和发展
Jackson@ML6 小时前
Python数据可视化简介
开发语言·python·数据可视化
赵琳琅6 小时前
Java语言的云计算
开发语言·后端·golang
lly2024066 小时前
jQuery 杂项方法
开发语言
赵琳琅6 小时前
MDX语言的安全开发
开发语言·后端·golang
开开又心心的学嵌入式7 小时前
C语言——指针进阶应用
c语言·开发语言
开开又心心的学嵌入式7 小时前
C语言——指针基础知识
c语言·开发语言
lonelyhiker7 小时前
javascript的原型链
开发语言·javascript·原型模式
夏梓蕙8 小时前
Elixir语言的软件开发工具
开发语言·后端·golang