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行号

相关推荐
岁忧28 分钟前
(LeetCode 每日一题) 3541. 找到频率最高的元音和辅音 (哈希表)
java·c++·算法·leetcode·go·散列表
小六子成长记1 小时前
【C++】:list容器全面解析(超详细)
c++·windows·list
IT灰猫1 小时前
C++轻量级配置管理器升级版
开发语言·c++·设计模式·配置管理·ini解析
axban2 小时前
QT M/V架构开发实战:QStandardItemModel介绍
开发语言·数据库·qt
大白同学4213 小时前
【C++】C++11介绍(Ⅱ)
开发语言·c++
油炸自行车3 小时前
【Qt】编写Qt自定义Ui控件步骤
开发语言·c++·qt·ui·自定义ui控件·qt4 自定义ui控件
酷飞飞4 小时前
PyQt 界面布局与交互组件使用指南
python·qt·交互·pyqt
呱呱巨基5 小时前
C/C++ 内存管理
c++·笔记·学习
半桔5 小时前
【网络编程】TCP 服务器并发编程:多进程、线程池与守护进程实践
linux·服务器·网络·c++·tcp/ip
橘子136 小时前
C++实战:搜索引擎项目(二)
开发语言·c++·搜索引擎