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 分钟前
Java项目实战II基于微信小程序的校运会管理系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
MessiGo8 分钟前
Python 爬虫 (1)基础 | 基础操作
开发语言·python
Tech Synapse13 分钟前
Java根据前端返回的字段名进行查询数据的方法
java·开发语言·后端
乌啼霜满天24922 分钟前
JDBC编程---Java
java·开发语言·sql
色空大师34 分钟前
23种设计模式
java·开发语言·设计模式
Bruce小鬼1 小时前
QT文件基本操作
开发语言·qt
2202_754421541 小时前
生成MPSOC以及ZYNQ的启动文件BOOT.BIN的小软件
java·linux·开发语言
我只会发热1 小时前
Java SE 与 Java EE:基础与进阶的探索之旅
java·开发语言·java-ee
懷淰メ1 小时前
PyQt飞机大战游戏(附下载地址)
开发语言·python·qt·游戏·pyqt·游戏开发·pyqt5
hummhumm1 小时前
第 22 章 - Go语言 测试与基准测试
java·大数据·开发语言·前端·python·golang·log4j