QStringListModel 绑定到QListView

1.QStringListModel 绑定到listView,从而实现MV模型视图

2.通过QStringListModel的新增、删除、插入、上下移动,listView来展示出来

3.下移动一行,传入curRow+2 的个人理解

布局

.h声明

cpp 复制代码
private:
    QStringList m_strList;
    QStringListModel *m_model;

.cpp

cpp 复制代码
#include "listmodelviewexample.h"
#include "ui_listmodelviewexample.h"

ListModelViewExample::ListModelViewExample(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::ListModelViewExample)
{
    ui->setupUi(this);

    m_strList<<"北京"<<"上海"<<"广州"<<"深圳"<<"天津"<<"成都"<<"山东"<<"河南"<<"河北";
    m_model= new QStringListModel(this);
    m_model->setStringList(m_strList);

    ui->listView->setModel(m_model);
    ui->chkEditable->setChecked(true);
    ui->listView->setEditTriggers(QAbstractItemView::DoubleClicked|
                                  QAbstractItemView::SelectedClicked);
}

ListModelViewExample::~ListModelViewExample()
{
    delete ui;
}

void ListModelViewExample::on_btnIniList_clicked()
{
    m_model->setStringList(m_strList);//重新载入
}


void ListModelViewExample::on_btnListClear_clicked()
{
    m_model->removeRows(0,m_model->rowCount());
}


void ListModelViewExample::on_chkEditable_clicked(bool checked)
{
    if(checked)
        ui->listView->setEditTriggers(QAbstractItemView::DoubleClicked
                                      |QAbstractItemView::SelectedClicked);
    else
        ui->listView->setEditTriggers(QAbstractItemView::NoEditTriggers);
}


void ListModelViewExample::on_btnListAppend_clicked()
{
    m_model->insertRow(m_model->rowCount());
    QModelIndex index= m_model->index(m_model->rowCount()-1,0);
    m_model->setData(index,"new Item",Qt::DisplayRole);
    ui->listView->setCurrentIndex(index);
}


void ListModelViewExample::on_btnListInsert_clicked()
{
    QModelIndex index= ui->listView->currentIndex();
    m_model->insertRow(index.row());
    m_model->setData(index,Qt::AlignRight,Qt::TextAlignmentRole);
    ui->listView->setCurrentIndex(index);
}


void ListModelViewExample::on_btnListDelete_clicked()
{
    QModelIndex index= ui->listView->currentIndex();
    m_model->removeRow(index.row());
}


void ListModelViewExample::on_btnListMoveUp_clicked()
{
    int curRow = ui->listView->currentIndex().row();
    QModelIndex index = QModelIndex();
    /*
    moveRow这个方法,为什么要-1? 我理解如下,
    1. 在目标位置curRow-1插入一行 插入的新行的行号为curRow-2
    2. 复制原curRow行到目标位置curRow-2
    3. 删除原curRow行
    */
    m_model->moveRow(index,curRow,index,curRow-1);
}


void ListModelViewExample::on_btnListMoveDown_clicked()
{
    int curRow = ui->listView->currentIndex().row();
    QModelIndex index = QModelIndex();
    /*
    moveRow这个方法,为什么要+2? 我理解如下,
    1. 在目标位置curRow+2插入一行
    2. 复制curRow行到目标位置curRow+1
    3. 删除curRow行
    */

   m_model->moveRow(index,curRow,index,curRow+2);
}

void ListModelViewExample::on_btnClearText_clicked()
{
    ui->plainTextEdit->clear();
}


void ListModelViewExample::on_btnListImport_clicked()
{
    QStringList tmpList = m_model->stringList();
    for(int i=0;i<tmpList.size();i++)
    {
        ui->plainTextEdit->appendPlainText(tmpList.at(i));
    }
}




void ListModelViewExample::on_btnListSort_clicked(bool checked)
{
    if(checked)
        m_model->sort(0,Qt::AscendingOrder);
    else
        m_model->sort(0,Qt::DescendingOrder);
}

void ListModelViewExample::on_listView_clicked(const QModelIndex &index)
{
    QString str1 = QString::asprintf("模型索引行号:row=%d,column=%d;\t",
                                     index.row(),index.column());

    QVariant var = m_model->data(index,Qt::DisplayRole);
    QString str2 = var.toString();

    int curRow = ui->listView->currentIndex().row();
    QString str3 = QString::asprintf(";\tlistView:row=%d",
                                     curRow);

    ui->statusbar->showMessage(str1+ str2+ str3);

}

QStringListModel->moveRow 上移传入curRow-1 下移传入curRow+2 这是为什么?有些别扭

cpp 复制代码
inline bool QAbstractItemModel::moveRow(const QModelIndex &sourceParent, int sourceRow,
                                        const QModelIndex &destinationParent, int destinationChild)

以下仅为个人理解。

destinationChild:创建了一个新行,该新行需要插入的位置,插入新行后,原行删除。

如下移一行,就需要在curRow+2的前面插入一行,插入的新行的行号为curRow+2,删除原行后变成curRow+1

再如上移一行,需要在curRow-1的前面插入一行,插入的新行号变成了curRow-1,而原curRow-1变成了curRow行号

相关推荐
傅里叶的耶13 分钟前
C++系列(二):告别低效循环!选择、循环、跳转原理与优化实战全解析
c++·visual studio
Vitta_U30 分钟前
MFC的List Control自适应主界面大小
c++·list·mfc
Dovis(誓平步青云)1 小时前
基于探索C++特殊容器类型:容器适配器+底层实现原理
开发语言·c++·queue·适配器·stack
feiyangqingyun2 小时前
全网唯一/Qt结合ffmpeg实现手机端采集摄像头推流到rtsp或rtmp/可切换前置后置摄像头/指定分辨率帧率
qt·智能手机·ffmpeg
随意0232 小时前
Qt 事件
开发语言·qt
鸥梨菌Honevid2 小时前
Qt自定义控件(1)——QPaintEvent
开发语言·qt
pipip.3 小时前
UDP————套接字socket
linux·网络·c++·网络协议·udp
孞㐑¥7 小时前
Linux之Socket 编程 UDP
linux·服务器·c++·经验分享·笔记·网络协议·udp
水木兰亭11 小时前
数据结构之——树及树的存储
数据结构·c++·学习·算法
CoderCodingNo11 小时前
【GESP】C++四级考试大纲知识点梳理, (7) 排序算法基本概念
开发语言·c++·排序算法