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

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

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

相关推荐
用户805533698032 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner2 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz7 天前
QML Hello World 入门示例
qt
xcyxiner10 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner10 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner11 天前
DicomViewer (添加模型类)3
qt
xcyxiner11 天前
DicomViewer (目录调整) 2
qt
xcyxiner11 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00613 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术13 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript