1、拖放事件概述
(1)、拖放一个文件进入窗口将触发拖放事件
(2)、每一个QWidget对象都能处理拖放事件
(3)、拖放事件的函数为
2、拖放事件中的QMimeData
(1)、QMimeData是Qt中的多媒体数据类
(2)、拖放事件通过QMimeData对象传递数据
(3)、QMimeData支持多种不同的多媒体数据类型
3、常用的MIME类型数据处理函数
4、自定义拖放事件的步骤
(1)、对接收拖放事件的对象调用setAcceptDrops成员函数
(2)、重写dragEnterEvent函数并判断MIME类型
A、期待类型:e->acceptProposedAction()
B、其它数据:e->ignore()
(3)、重写dragEvent()函数并判断MIME类型
A、期待类型:从事件对象中获取MIME数据并处理
B、其它数据:e->ignore()
拖放事件初探
#include "Widget.h" #include <QDragEnterEvent> #include <QDropEvent> #include <QMimeData> #include <QList> #include <QDebug> #include <QUrl> Widget::Widget(QWidget *parent) : QWidget(parent) { setAcceptDrops(true);//1.在接收拖放事件的对象里调用setAcceptDrops(true) } void Widget::dragEnterEvent(QDragEnterEvent *e)//2.重写void dragEnterEvent(QDragEnterEvent *e) { if(e->mimeData()->hasUrls())//A、期待类型:e->acceptProposedAction() { e->acceptProposedAction(); } else//B、其它数据:e->ignore() { e->ignore(); } } void Widget::dropEvent(QDropEvent* e)//3.重写void dropEvent(QDropEvent* p) { if(e->mimeData()->hasUrls())//A、期待类型:从事件对象中获取MIME数据并处理 { QList<QUrl> list = e->mimeData()->urls(); for(int i = 0; i<list.count(); i++) { qDebug() << list[i].toLocalFile();//打印路径出来 } } else//B、其它数据:e->ignore() { e->ignore(); } } Widget::~Widget() { } 拖放事件初探1、打开文件和拖放文件的异同
(1)、打开和拖放都需要先判断是否有数据未保存(所以调用相同的函数)
(2)、保存好数据后打开操作是从弹出的一个文本对话框获取文件路径
(3)、保存好数据后拖放事件是从MimeData里边获取文件路径
(4)、最后通过路径来打开的方式都一样(所以调用相同的函数),所以说区别就是在(2)、(3)
2、文本编辑器拖放事件的解决方案
(1)、调用主窗口对象的setAcceptDrops成员函数
(2)、重写dragEnterEvent函数并判断MIME类型
(3)、重写dragEvent()函数并判断MIME类型后打开文件
文本编辑器的dragEnterEvent(QDragEnterEvent* e)和dropEvent(QDropEvent* e)
void MainWindow::dragEnterEvent(QDragEnterEvent* e) { if(e->mimeData()->hasUrls()) { e->acceptProposedAction(); } else { e->ignore(); } } void MainWindow::dropEvent(QDropEvent* e) { if(e->mimeData()->hasUrls()) { QList<QUrl> list = e->mimeData()->urls(); QString path = list[0].toLocalFile(); QFileInfo fi(path); if(fi.isFile()) { preEditorChanged(); if(!m_isTextChanged) { openFileToEdit(path); } } else { showErrorMessage("Canot open a folder"); } } else { e->ignore(); } } 文本编辑器的dragEnterEvent(QDragEnterEvent* e)和dropEvent(QDropEvent* e)修改的文件除了头文件还有:
将onFileOpen()里面的部分代码抽取出来封装成一个函数
修改后的onFileOpen()
void MainWindow::onFileOpen() { preEditorChanged(); if(!m_isTextChanged) { QString path = showFileDialog(QFileDialog::AcceptOpen, "open"); openFileToEdit(path); } } 修改后的onFileOpen()(1)、QWidget对象都能处理拖放事件
(2)、自定义拖放事件的方法
A、对接收拖放事件的对象调用setAcceptDrops成员函数
B、重写dragEnterEvent函数并判断MIME类型
C、重写dragEvent()函数并判断MIME类型