Qt拖拽事件,实现控件内项的相互拖拽
文章目录
- 1拖拽演示
- 2 步骤
- 3 实现
这里主要以QTableview控件为例,实现表格内数据的相互拖拽。
1拖拽演示

2 步骤
自定以QTableView类,在自定义类中重写拖拽事件:
void dropEvent(QDropEvent *event);
void dragEnterEvent(QDragEnterEvent *event);
void dragMoveEvent(QDragMoveEvent *event);
void dragLeaveEvent(QDragLeaveEvent *event);
实现自定义的QTableView,在鼠标点击项的时候,构造一个图片,模拟出项被拖动的样子,通过
QMimeData来传递数据,QDrag会触发表格的进入事件,在进入事件内出入一个新的项,并通过发送信号的对象,来通过指针删除原来的项,大概思路就是这样。
3 实现
#include <QTableView>
#include <QStandardItemModel>
#include <QDropEvent>
#include <QMouseEvent>
#include <QDragEnterEvent>
#include<QByteArray>
class CTableView : public QTableView
{Q_OBJECTpublic:CTableView(QWidget *parent);~CTableView();
public:void insertNewItem(QString str);void setHorizontalHeaderName(QString _name);bool removeItem(QString str);void dropEvent(QDropEvent *event);void dragEnterEvent(QDragEnterEvent *event);void dragMoveEvent(QDragMoveEvent *event);void dragLeaveEvent(QDragLeaveEvent *event);
private:void slotItemPressed(const QModelIndex &index);
private:QStandardItemModel* m_model;
};
#include "ctableview.h"
#include <QHeaderView>
#include <QPainter>
#include <QMimeData>
#include <QDrag>
#include <QDebug>
CTableView::CTableView(QWidget *parent): QTableView(parent)
{setAcceptDrops(true);m_model = new QStandardItemModel();this->setModel(m_model);this->verticalHeader()->setVisible(false);this->setEditTriggers(QAbstractItemView::NoEditTriggers);connect(this, &CTableView::pressed, this, &CTableView::slotItemPressed);
}CTableView::~CTableView()
{}void CTableView::insertNewItem(QString str)
{int t_row = m_model->rowCount();QStandardItem* t_item = new QStandardItem(str);m_model->setItem(t_row, 0, t_item);m_model->item(t_row, 0)->setTextAlignment(Qt::AlignHCenter);m_model->item(t_row, 0)->setBackground(QColor(187, 203, 233));
}void CTableView::setHorizontalHeaderName(QString _name)
{m_model->setHorizontalHeaderLabels(QStringList(_name));this->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);// 设置表头调整模式为 Stretchthis->horizontalHeader()->setStretchLastSection(true);// 将最后一列拉伸到表格宽度this->horizontalHeader()->setStyleSheet("QHeaderView::section {""color: rgb(32,159,223);padding-left: 4px;border: 1px solid #6c6c6c;}");
}bool CTableView::removeItem(QString str)
{for (int row = 0; row < m_model->rowCount(); row++){if (m_model->item(row, 0)->text() == str){return m_model->removeRow(row);}}return false;
}void CTableView::dropEvent(QDropEvent *event)
{if (!event->mimeData()->hasText()) { // 修改判断条件return;}insertNewItem(event->mimeData()->text());CTableView* tableView = qobject_cast<CTableView*>(event->source());if (tableView == nullptr){return;}tableView->removeItem(event->mimeData()->text());
}void CTableView::dragEnterEvent(QDragEnterEvent *event)
{//这个函数的主要作用是根据拖动数据中是否包含文本,决定是否接受拖放操作,并将操作类型设置为建议类型。if (event->mimeData()->hasText()) { // 修改判断条件event->acceptProposedAction();}
}void CTableView::dragMoveEvent(QDragMoveEvent *event)
{if (event->mimeData()->hasText()) { // 修改判断条件event->acceptProposedAction();}
}void CTableView::dragLeaveEvent(QDragLeaveEvent *event)
{Q_UNUSED(event);
}void CTableView::slotItemPressed(const QModelIndex &index)
{if (!index.isValid()){return;}QStandardItem* item = m_model->item(index.row(), index.column());QPixmap* pixmap = new QPixmap(this->horizontalHeader()->sectionSize(0), this->verticalHeader()->sectionSize(0)); // 创建画布pixmap->fill(QColor(187, 203, 233)); // 填充绿色背景QPainter t_painter(this); // 创建 QPainter 对象t_painter.begin(pixmap);t_painter.drawText(QRectF(0, 0, 100, 20), Qt::AlignCenter, item->text()); // 在画布上绘制文字t_painter.end();QMimeData* t_mimeData = new QMimeData;t_mimeData->setText(item->text());QPoint hotSpot(pixmap->width() / 2, pixmap->height() / 2); // 设置热点位置为图片中心QDrag* t_drag = new QDrag(this);t_drag->setMimeData(t_mimeData);t_drag->setPixmap(*pixmap);t_drag->setHotSpot(hotSpot); // 设置热点位置t_drag->exec(Qt::CopyAction | Qt::MoveAction);delete t_drag;t_drag = nullptr;delete pixmap;pixmap = nullptr;
}
程序主窗口,new CTableView表格
#include "ctestdragitem.h"
#include <QGridLayout>
const int TableCount = 9;
CTestDragItem::CTestDragItem(QWidget *parent): QWidget(parent)
{ui.setupUi(this);QGridLayout* gridLayout = new QGridLayout(ui.widget);gridLayout->setSpacing(10);gridLayout->setContentsMargins(10, 10, 10, 10);for (int i=0; i< TableCount; i++){CTableView * tableView = new CTableView(ui.widget);tableView->setHorizontalHeaderName(QString("table%1").arg(i));tableView->insertNewItem(QString("item%1%2").arg(i / 3).arg(i % 3));gridLayout->addWidget(tableView, i / 3, i % 3);}}
通过以上方法就可以实现,表格数据的相互拖拽,这里只是举例了简单的用法,更复杂的操作也差不多,需要自己处理逻辑。
相关文章:
Qt拖拽事件,实现控件内项的相互拖拽
文章目录 1拖拽演示2 步骤3 实现 这里主要以QTableview控件为例,实现表格内数据的相互拖拽。 1拖拽演示 2 步骤 自定以QTableView类,在自定义类中重写拖拽事件: void dropEvent(QDropEvent *event); void dragEnterEvent(QDragEnterEvent *…...
基于MATLAB实现的OFDM仿真调制解调,BPSK、QPSK、4QAM、16QAM、32QAM,加性高斯白噪声信道、TDL瑞利衰落信道
基于MATLAB实现的OFDM仿真调制解调,BPSK、QPSK、4QAM、16QAM、32QAM,加性高斯白噪声信道、TDL瑞利衰落信道 相关链接 OFDM中的帧(frame)、符号(symbol)、子载波(subcarriers)、导频…...
Redis核心技术与实战【学习笔记】 - 21.Redis实现分布式锁
概述 在《20.Redis原子操作》我们提到了应对并发问题时,除了原子操作,还可以通过加锁的方式,来控制并发写操作对共享数据的修改,从而保证数据的正确性。 但是,Redis 属于分布式系统,当有多个客户端需要争…...
17.Golang channel的基本定义及使用
目录 概述实践无缓冲 channel代码结果 缓冲 channel代码结果 channel的关闭特点代码结果range代码结果 select channel代码结果 结束 概述 此篇文章介绍 channel 的用法 无缓冲 channel缓冲 channelchannel的关闭特点range channelselect channel 每一种,配上完整…...
Linux - iptables 防火墙
一. 安全技术和防火墙 1.安全技术 入侵检测系统(Intrusion Detection Systems):特点是不阻断任何网络访问,量化、定位来自内外网络的威胁情况,主要以提供报警和事后监督为主,提供有针对性的指导措施和安全…...
如何在FBX剔除Lit.shader依赖
1)如何在FBX剔除Lit.shader依赖 2)Unity出AAB包(PlayAssetDelivery)模式下加载资源过慢问题 3)如何在URP中正确打出Shader变体 4)XLua打包Lua文件粒度问题 这是第371篇UWA技术知识分享的推送,精…...
cesium-测量高度垂直距离
cesium做垂直测量 完整代码 <template><div id"cesiumContainer" style"height: 100vh;"></div><div id"toolbar" style"position: fixed;top:20px;left:220px;"><el-breadcrumb><el-breadcrumb-i…...
Adobe Illustrator CEP插件开发入门指南
引言 Adobe Creative Cloud(创意云)中的Illustrator作为一款全球领先的矢量图形设计软件,为设计师提供了丰富的功能和无限的创作可能性。为了进一步增强其功能并满足个性化工作流程需求,Adobe引入了Common Extensibility Platform…...
【Spring】自定义注解 + AOP 记录用户的使用日志
目录 编辑 自定义注解 AOP 记录用户的使用日志 使用背景 落地实践 一:自定义注解 二:切面配置 三:Api层使用 使用效果 自定义注解 AOP 记录用户的使用日志 使用背景 (1)在学校项目中,安防平台…...
linux互斥锁:递归锁,非递归锁用法详解
在实际的项目中经常涉及到共享资源,共享资源被多个线程访问会出现竞争现象;为了解决竞争和保护共享资源常用的机制之一就是互斥锁! 互斥锁又分为递归锁和非递归锁,互斥锁默认是非递归锁,也是我们常用的上锁方式。那么什么是递归锁和非递归锁呢? 非递归锁(Non-recursive …...
MacOS安装dmg提示已文件已损坏的解决方法
MacOS安装dmg提示已文件已损坏的解决方法 导致原因是应用没有上传到苹果的appstroe,系统限制了安装,破碎提示是苹果的误导小手段 方法 一 App 在macOS Catalina(比较新的系统,例如m1,m2也适用)下提示已损坏…...
前端输入框简单实现检测@成员输入
大体逻辑是 给input框添加一个input监听,并判断输入是否为获取当前光标的位置,你输入的肯定在光标之前,且肯定是最后一个input输入的内容换行可以被认为空格,需要进行全局替换判断成功的逻辑分为两部分,前方一般来说是…...
通过与chatGPT交流实现零样本事件抽取
1、写作动机: 近来的大规模语言模型(例如Chat GPT)在零样本设置下取得了很好的表现,这启发作者探索基于提示的方法来解决零样本IE任务。 2、主要贡献: 提出了基于chatgpt的多阶段的信息抽取方法:在第一阶…...
使用nodejs和html布局一个简单的视频播放网站,但是使用localhost:端口访问html无法加载视频
js代码: // app.js const express require(express); const path require(path); const app express();// 设置静态文件目录,这里假设你的视频文件在public/videos/目录下 app.use(express.static(path.join(__dirname, )));// 设置主页路由…...
【AG32VF407】国产MCU+FPGA Verilog双边沿检测输出方波
视频讲解 [AG32VF407]国产MCUFPGA Verilog双边沿检测输出方波 实验过程 本次使用使用AG32VF407开发板中的FPGA,使用双clk的双边沿进行检测,同步输出方波 同时可以根据输出的方波检测clk的频率,以及双clk的相位关系,如下为verilog…...
[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--强化学习、模仿学习、机器人
专属领域论文订阅 关注{晓理紫},每日更新论文,如感兴趣,请转发给有需要的同学,谢谢支持 如果你感觉对你有所帮助,请关注我,每日准时为你推送最新论文。 为了答谢各位网友的支持,从今日起免费为3…...
为什么说TiDB在线扩容对业务几乎没有影响
作者: 数据源的TiDB学习之路 原文来源: https://tidb.net/blog/e82b2c5f 当前的数据库种类繁多,墨天轮当前统计的所有国产数据库已经有 290个 ,其中属于关系型数据库的有 166个 。关系型数据库从部署架构上又可以分为集中式…...
STM32--SPI通信协议(2)W25Q64简介
一、W25Q64简介 1、W25Qxx中的xx是不同的数字,表示了这个芯片不同的存储容量; 2、存储器分为易失性与非易失性,主要区别是存储的数据是否是掉电不丢失: 易失性存储器:SRAM、DRAM; 非易失性存储器ÿ…...
svn安装与搭建
1、svn搭建 # yum install subversion -y //安装 # svnserve --version //查看版本 2、创建仓库目录repo # mkdir -p /opt/svn/repo //创建目录 # svnadmin create /opt/svn/repo/ //创建新仓库 # ls !$ …...
什么是缓存击穿、缓存穿透、缓存雪崩?
缓存雪崩 缓存雪崩是指缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。 解决方案 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。一般并发量不是特别多的时…...
Ansible Roles深度指南:如何像搭积木一样管理复杂Playbook?
Ansible Roles架构设计:构建企业级配置管理的乐高积木 在电商系统多环境部署的复杂场景中,开发团队经常面临这样的困境:测试环境的配置意外污染了生产环境,不同服务间的变量命名冲突导致部署失败,或者新增服务器时需要…...
重新定义零代码开发:H5-Dooring的反常识实践指南
重新定义零代码开发:H5-Dooring的反常识实践指南 【免费下载链接】h5-Dooring H5 Page Maker, H5 Editor, LowCode. Make H5 as easy as building blocks. | 让H5制作像搭积木一样简单, 轻松搭建H5页面, H5网站, PC端网站,LowCode平台. 项目地址: https://gitcode…...
Palworld存档转换工具终极指南:轻松编辑游戏数据的完整方案
Palworld存档转换工具终极指南:轻松编辑游戏数据的完整方案 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools Palworld存档工具是一个强…...
Cursor Pro功能优化工具:提升AI编程体验的开源解决方案
Cursor Pro功能优化工具:提升AI编程体验的开源解决方案 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your tr…...
Natron Rotoscoping与跟踪技术:专业影视特效制作终极指南
Natron Rotoscoping与跟踪技术:专业影视特效制作终极指南 【免费下载链接】Natron Open-source video compositing software. Node-graph based. Similar in functionalities to Adobe After Effects and Nuke by The Foundry. 项目地址: https://gitcode.com/gh_…...
小白也能玩转零售AI:Ostrakon-VL-8B快速上手,实测效果超预期
小白也能玩转零售AI:Ostrakon-VL-8B快速上手,实测效果超预期 1. 零售AI新选择:Ostrakon-VL-8B简介 1.1 什么是Ostrakon-VL-8B? Ostrakon-VL-8B是一款专为零售和餐饮行业设计的智能视觉理解系统。简单来说,它就像是一…...
SeqGPT-560M快速部署:阿里云ECS+双卡4090+Docker一键运行指南
SeqGPT-560M快速部署:阿里云ECS双卡4090Docker一键运行指南 1. 项目简介 SeqGPT-560M是一个专门为企业级信息抽取需求定制开发的高性能AI系统。与常见的聊天对话模型不同,这个系统专注于一件事:从非结构化文本中精准提取关键信息。 想象一…...
Qwen3-ASR-0.6B高性能优化:CNN加速语音特征提取
Qwen3-ASR-0.6B高性能优化:CNN加速语音特征提取 语音识别技术正在快速融入我们的日常生活,从智能助手到实时字幕,都离不开高效的语音转文本能力。Qwen3-ASR-0.6B作为一款轻量级语音识别模型,在保证识别准确率的同时,更…...
大模型学习笔记------SAM模型架构拆解与实战指引
1. SAM模型架构全景拆解 第一次看到SAM模型时,就像拿到了一台精密的瑞士手表——外表简洁但内部构造复杂。这个由Meta提出的"分割一切"模型,确实改变了计算机视觉领域的游戏规则。想象一下,你只需要在图片上随便点几个点࿰…...
Kandinsky-5.0-I2V-Lite-5s应用场景:游戏NPC立绘动态化+过场动画快速生成
Kandinsky-5.0-I2V-Lite-5s应用场景:游戏NPC立绘动态化过场动画快速生成 1. 游戏开发中的视觉挑战 在游戏开发过程中,NPC立绘动态化和过场动画制作一直是两个耗时费力的环节。传统方法需要美术团队逐帧绘制动画,或者使用复杂的3D建模工具&a…...
