当前位置: 首页 > article >正文

QTableView 实现表格及相关用法(C++)(QStandardItemModel+QItemSelectionModel)

关于QTableView的基础功能使用有很多相关博客,此处不再复述,具体可以参考:

1、Qt QStandardItemModel(1.超级详细用法)_qtablemodel用法-CSDN博客

2、【Qt笔记】QTableView控件详解-CSDN博客

本文主要做以下两点功能的补充:

1、对QTableView表格选中行内容做上下移动

2、对QTableView表格选中行删除

一、初始化表格

//假设已有tabview组件,名称为tabView

   QStandardItemModel *model;            //创建一个模型
   QItemSelectionModel *theSelection;     //创建模型索引

   model = new QStandardItemModel();
   theSelection = new QItemSelectionModel(model);

   ui->tabView->setModel(model);        //设置模型
   ui->tabView->setSelectionModel(theSelection)    //设置模型索引

   ui->tableView->setSelectionMode(QAbstractItemView::ExtendedSelection);
   ui->tableView->setSelectionBehavior(QAbstractItemView::SelectItems);

   //设置表格列字段名
    model->setColumnCount(3);//设置3列
    model->setHeaderData(0,Qt::Horizontal,"学号");
    model->setHeaderData(1,Qt::Horizontal,"名称");
    model->setHeaderData(2,Qt::Horizontal,"电话");
    //设置内容
    model->setItem(0,0,new QStandardItem("001"));
    model->setItem(1,0,new QStandardItem("002"));
    model->setItem(2,0,new QStandardItem("003"));

    model->setItem(0,1,new QStandardItem("李华"));
    model->setItem(1,1,new QStandardItem("小明"));
    model->setItem(2,1,new QStandardItem("老王"));

    model->setItem(0,2,new QStandardItem("111"));
    model->setItem(1,2,new QStandardItem("222"));
    model->setItem(2,2,new QStandardItem("333"));

二、选中某行内容,点击按钮触发"删除"

1、按钮绑定函数

//假设已有按钮,名称为pushButton_remove

//头文件中:
private slots:
    void RemoveRow();

//cpp中,初始化时:
//pushButton_remove按钮绑定RemoveRow()函数
connect(ui->pushButton_remove,SIGANL(clicked(bool)),this,SLOT(RemoveRow()));

2、写一个删除选中行的函数

void YourQtProject::RemoveRow()
{
    QModelIndex curIndex = theSelection->currentIndex();
    //如果选中行是最后一行,则无需重新排序
    if(curIndex.row()==model->rowCount()-1)
    {
        model->removeRow(model->rowCount()-1);
    }
    else
    {
        //删除当前选中行,并且重新排序序号
        model->removeRow(curIndex.row());
        theSelection->setCurrentIndex(curIndex,QItemSelectionModel::Select);
    }
}

三、选中某行内容,点击按钮触发"向上移动"&“向下移动”

1、按钮绑定函数

//假设已有向上移动按钮,名称为pushButton_Upmove
//假设已有向上移动按钮,名称为pushButton_Downmove

//头文件中:
private slots:
    void Upmove();
    void Downmove();

//cpp中,初始化时:
//pushButton_remove按钮绑定RemoveRow()函数
connect(ui->pushButton_Upmove,SIGANL(clicked(bool)),this,SLOT(Upmove()));
connect(ui->pushButton_Downmove,SIGANL(clicked(bool)),this,SLOT(Downmove()));

2、写"向上移动"&“向下移动”的函数

void YourQtProject::Upmove()
{
    //获取选中的行序号
    QModelIndex curIndex = theSelection->currentIndex();
    //如果选中行不是第一行,就可以向上移动
    if(curIndex.row()!=0)
    {
        for(int i = 0;i<model->columnCount();++i)
        {
            QStandarItem* item1 = model->takeItem(curIndex.row(),i);
            QStandarItem* item2 = model->takeItem(curIndex.row()-1,i);
            //本质是选中行与上一行互换内容
            model->setItem(curIndex.row(),i,item2);
            model->setItem(curIndex.row()-1,i,item1);
        }
    }
}

void YourQtProject::Downmove()
{
    //获取选中的行序号
    QModelIndex curIndex = theSelection->currentIndex();
    //如果选中行不是最后一行,就可以向下移动
    if(curIndex.row()!=model->rowCount()-1)
    {
        for(int i = 0;i<model->columnCount();++i)
        {
            QStandarItem* item1 = model->takeItem(curIndex.row(),i);
            QStandarItem* item2 = model->takeItem(curIndex.row()+1,i);
            //本质是选中行与下一行互换内容
            model->setItem(curIndex.row(),i,item2);
            model->setItem(curIndex.row()+1,i,item1);
        }
    }
}

本文内容为笔者在网页手写编辑,可能存在疏忽错误导致内容或格式不对,如遇,麻烦指出,感谢!


http://www.kler.cn/a/417321.html

相关文章:

  • MySQL的底层原理与架构
  • 退格法记单词(类似甘特图)
  • Node.js 环境配置
  • 深入浅出 NRM:加速你的 npm 包管理之旅
  • 低代码提升交付效率的公式计算
  • hot100(8)
  • [Linux] 进程间通信——匿名管道命名管道
  • 提升异步编程性能:使用 uvloop 加速你的 Python 应用
  • 云硬盘挂载到新服务器,怎么恢复数据?
  • 命令提示符窗口(CMD)控制windows操作系统
  • MySQL自启动失败(MySQL不能开机自启)解决方案_MySQL开机自启疑难杂症解决,适用Win11/Win10
  • Redis 分布式锁实现方案
  • Leecode刷题C语言之判断是否可以赢得数字游戏
  • 在CentOS7上更换为阿里云源
  • 【RK3588 Linux 5.x 内核编程】-发送信号到用户空间
  • 高级IO
  • Golang面经
  • Linux 安装scala
  • Ansible自动化一键部署单节点集群架构
  • zotero文献阅读配置1:待更新
  • 【Oracle11g SQL详解】ORDER BY 子句的排序规则与应用
  • pandas数据处理及其数据可视化的全流程
  • 爬虫与反爬-旋转验证码突破方案(知名短视频、TK海外版 及 某东等等)
  • Java设计模式 —— 【创建型模式】原型模式(浅拷贝、深拷贝)详解
  • (附项目源码)PHP开发语言,225 基于PHP的高校二手物品交易系统的设计与实现,计算机毕设程序开发+文案(LW+PPT)
  • 深入理解异步编程:使用 `asyncio` 和 `aiohttp` 进行并发请求