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

qt qtablewidget 行拖动(事件过滤器)

#include <QTableWidget>
class TablewidgetLineDropFilter : public QObject {Q_OBJECT
public:explicit TablewidgetLineDropFilter(QTableWidget* _box,QObject *parent = nullptr) : QObject(parent) {tablewidget=_box;}bool eventFilter(QObject *obj, QEvent *event) override {if(event->type() == QEvent::Drop){int row_src,row_dst;row_src = tablewidget->currentRow();                        // 原行号 可加ifQDropEvent *dropEvent = static_cast<QDropEvent*>(event);QTableWidgetItem *item = tablewidget->itemAt(dropEvent->pos()); // 获取落点的itemif(item !=nullptr){                                        // 判断是否为空row_dst = item->row();                                 // 不为空 获取其行号// 保证鼠标落下的位置 就是拖拽的一行最后所移动到的位置(考虑插入新行 移除原行的上下变化)row_src = (row_src > row_dst?    row_src + 1:row_src); // 如果src在dst的下方(行号大),后续插入dst会影响src的行号row_dst = (row_src < row_dst?    row_dst + 1:row_dst); // 如果src在dst的上方(行号小),后续移除src会影响dst的行号tablewidget->insertRow(row_dst);                              // 插入一行}else{                          // 落点没有item 说明拖动到了最下面row_dst = tablewidget->rowCount();// 获取行总数tablewidget->insertRow(row_dst);  // 在最后新增一行}// 执行移动 并移除原行for(int i = 0;i < tablewidget->columnCount();i++){            // 遍历列tablewidget->setItem(row_dst,i,tablewidget->takeItem(row_src,i));// 每一列item的移动}tablewidget->removeRow(row_src); // 删除原行//            for(int i = 0;i < tablewidget->columnCount();i++){
//                QTableWidgetItem* selectedItem = tablewidget->item(row_dst, i);
//                tablewidget->setCurrentItem(selectedItem);
//            }return true;}return QObject::eventFilter(obj, event);}
private:QTableWidget* tablewidget;
};

应用

table->setDragEnabled(true);  // 允许拖动table->setAcceptDrops(true);  // 接受放置table->setDragDropMode(QAbstractItemView::InternalMove);  // 内部移动模式table->setSelectionBehavior(QAbstractItemView::SelectRows);  // 整行选择table->setDropIndicatorShown(true);  // 显示放置位置指示table->viewport()->installEventFilter(new TablewidgetLineDropFilter(table));
http://www.jsqmd.com/news/7538/

相关文章:

  • 3.8 材料链路层设备 (答案见原书 P122)
  • for (EmpExpr empExpr : exprList) {}语法糖
  • 251003
  • 深入解析:以CodeBuddy Code为砚,Prompt为丹青,勾勒编程星河
  • 学习项目movie-web:构建本地电影、电视视频中心 - 教程
  • Rust泛型详解 - 实践
  • AT_abc205_e [ABC205E] White and Black Balls
  • transformers音频实战01-音频概念 - 教程
  • Python 自动化导出PDF表格:List、Dictionary、Pandas DataFrame和数据库实例演示 - 指南
  • Rust Slint库达成桌面萌宠源码分享(包含拖动、右键菜单效果)
  • Redis 持久化机制 - 教程
  • 2025染井吉野樱公司 TOP 种植服务推荐排行榜,染井吉野樱花苗,五公分染井吉野樱,十公分染井吉野樱,染井吉野樱批发,染井吉野樱基地,染井吉野樱花树公司推荐
  • glazewm_windows平铺窗口管理器使用方法
  • 详细介绍:LeetCode热题100(1-7)
  • 树莓派搭建NAS之三:使用OpenList挂载网盘
  • sg-ss 逆向分析
  • PySide6 之登录界面设计
  • Jupyter notebook 虚拟环境(服务)EnvironmentLocationNotFound: Not a conda environment
  • 本地部署overleaf服务帮助latex论文编写 —— 操作笔记
  • 【Groovy】Array、List、Set、Map简介
  • 深入解析:【Python高级语法与正则表达式】
  • 20届-测试面经-华为OD - 指南
  • 【大信息技术】ClickHouse配置详细解读
  • 做题记录4
  • lucene 8.7.0 版本中的倒排索引、数字、DocValues三种类型的查询性能对比 - 教程
  • 数哈多应用授权系统如何为Go语言编程开发者给予知识产权保护?
  • 好听的音乐地址
  • display ip routing-table故障判断及题目 - 详解
  • 完整教程:华为eNSP环境安装和命令使用教程
  • 分布式架构初识:为什么需要分布式 - 教程