Qt 拖放事件 drag drop

2024-01-04 11:32
文章标签 qt 事件 drop 拖放 drag

本文主要是介绍Qt 拖放事件 drag drop,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Qt在部件中进行拖放

Qt中的拖放支持以QDrag为中心,拖放操作的大部分细节由该类处理。

除了创建QDrag对象外,还需要重新实现dragMoveEvent()来接受事件和dropEvent()处理部件上的数据。最终DragEnterEvent()需要重新实现才能接受事件。

在处理拖放操作的控件上,还需要调用

setAcceptDrops(true);

代码实现:

mydialog.h

class MyDialog : public QDialog
{Q_OBJECTpublic:explicit MyDialog(QWidget *parent = nullptr);~MyDialog();public slots:void makeDrag();protected:void dropEvent(QDropEvent *de);void dragMoveEvent(QDragMoveEvent *de);void dragEnterEvent(QDragEnterEvent *event);private:Ui::MyDialog *ui;
};class MyGroupBox : public QGroupBox
{public:MyGroupBox(QWidget *parent = nullptr) : QGroupBox(parent) {}protected:void dropEvent(QDropEvent *de);void dragMoveEvent(QDragMoveEvent *de);void dragEnterEvent(QDragEnterEvent *event);
};

mydialog.cpp

#include <QDebug>MyDialog::MyDialog(QWidget *parent) :QDialog(parent),ui(new Ui::MyDialog)
{ui->setupUi(this);QHBoxLayout *layout = new QHBoxLayout(this);QPushButton *pushButton = new QPushButton("Click Me", this);layout->addWidget(pushButton);connect(pushButton, SIGNAL(pressed()), this, SLOT(makeDrag()));MyGroupBox *box = new MyGroupBox(this);layout->addWidget(box);// 允许在dialog上拖放setAcceptDrops(true);// 允许在group box上拖放box->setAcceptDrops(true);
}MyDialog::~MyDialog()
{delete ui;
}void MyDialog::makeDrag() {QDrag *dr = new QDrag(this);// 拖放操作传递的数据存放在QMimeData 对象中QMimeData *data = new QMimeData;data->setText("This is a test");// 将QMimeData 数据的所属权分配给QDrag 对象dr->setMimeData(data);// 开始拖放操作dr->start();
}void MyDialog::dragMoveEvent(QDragMoveEvent *de) {// 在此处接收拖放事件de->accept();
}void MyDialog::dragEnterEvent(QDragEnterEvent *event) {// 将drop操作设置为建议的操作event->acceptProposedAction();
}void MyDialog::dropEvent(QDropEvent *de) {// 将数据解包,并按照希望的方式处理qDebug("Contents: my dialog %s", de->mimeData()->text().toLatin1().data());
}void MyGroupBox::dropEvent(QDropEvent *de) {// 将数据解包,并按照希望的方式处理qDebug("Contents: group box %s", de->mimeData()->text().toLatin1().data());
}void MyGroupBox::dragMoveEvent(QDragMoveEvent *de) {// 在此处接收拖放事件de->accept();
}void MyGroupBox::dragEnterEvent(QDragEnterEvent *event) {// 将drop操作设置为建议的操作event->acceptProposedAction();
}

调用:

int main(int argc, char *argv[])
{QApplication a(argc, argv);MyDialog d;d.show();return a.exec();
}

在groupbox上放开和在dialog中放开鼠标,如下输出:

Contents: group box This is a test
Contents: my dialog This is a test

这篇关于Qt 拖放事件 drag drop的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/569200

相关文章

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Qt中QGroupBox控件的实现

《Qt中QGroupBox控件的实现》QGroupBox是Qt框架中一个非常有用的控件,它主要用于组织和管理一组相关的控件,本文主要介绍了Qt中QGroupBox控件的实现,具有一定的参考价值,感兴趣... 目录引言一、基本属性二、常用方法2.1 构造函数 2.2 设置标题2.3 设置复选框模式2.4 是否

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

Qt把文件夹从A移动到B的实现示例

《Qt把文件夹从A移动到B的实现示例》本文主要介绍了Qt把文件夹从A移动到B的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录如何移动一个文件? 如何移动文件夹(包含里面的全部内容):如何删除文件夹:QT 文件复制,移动(

spring @EventListener 事件与监听的示例详解

《spring@EventListener事件与监听的示例详解》本文介绍了自定义Spring事件和监听器的方法,包括如何发布事件、监听事件以及如何处理异步事件,通过示例代码和日志,展示了事件的顺序... 目录1、自定义Application Event2、自定义监听3、测试4、源代码5、其他5.1 顺序执行