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 !$ …...
什么是缓存击穿、缓存穿透、缓存雪崩?
缓存雪崩 缓存雪崩是指缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。 解决方案 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。一般并发量不是特别多的时…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
Vue3 PC端 UI组件库我更推荐Naive UI
一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用,前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率,还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库(Naive UI、Element …...
