在窗体启用拖放功能,可以使用QWidget上所继承下来的setAcceptDrops()方法,设定组件接受拖放动作,在拖放动作发生时,会 有相对应的QDragEnterEvent、QDragMoveEvent、QDragLeaveEvent与QDropEvent等事件发生,您可以重 新定义dragEnterEvent()、dragMoveEvent()、dragLeaveEvent()与dropEvent()等事件处理者,以 处理相对应的拖放事件,通常会使用的是dragEnterEvent()与dropEvent()。
setAcceptDrops(true)设定接受拖放,当图片档案被拖入组件时,发生QDragEnterEvent并分派 给dragEnterEvent()处理。QDragEnterEvent的mimeData()方法传回QMimeData,当中包括了MIME (Multipurpose Internet MailExtensions)类型的相关信息,hasFormat("text/uri-list")测试是否含有文字信息的URI(Universal Resource Identifier),也可以使用hasUrls()来进行同样的测试。 当拖放行为开始执行时,执行拖放行为的一方会需要知道接受放置的另一方接受何种操作,例如拖放档案时,当拖放完成时,原档案是被复制或移动。执行拖放行为的一方会设定可被接受的动作,而接受放置的一方可选择接受何种动作,并传回相关信息给执行方,acceptProposedAction()的作用为接受执行拖放行为的一方所设定的预设动作。
有些组件默认即接受拖放行为,例如QLineEdit,您可以直接将文字拖曳至QLineEdit,这会将拖曳的文字置放至您置放的位置,若您想改变这个 行为,可以设定QLineEdit的setAcceptDrops()为false,然后设定其父组件的setAcceptDrops()为true,让 拖放事件传播至父组件,由父组件来处理拖放相关事件,以改变QLineEdit的预设拖放行为,例如让纯文本档案拖至QLineEdit时,可以自动加载 文字至QLineEdit中。
创建窗口程序-拖入textEdit
#ifndef MAINWINDOW_MYDRAGDROP_H
#define MAINWINDOW_MYDRAGDROP_H
#include
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow_mydragdrop; }
QT_END_NAMESPACE
class MainWindow_mydragdrop : public QMainWindow
{
Q_OBJECT
public:
MainWindow_mydragdrop(QWidget *parent = nullptr);
~MainWindow_mydragdrop();
private:
Ui::MainWindow_mydragdrop *ui;
protected:
void dragEnterEvent2(QDragEnterEvent *drag_event);//拖入--不要更换名字--拖入不会触发重新改名的函数---无用
void dragReleaseEvent2(QDropEvent *release_event);//释放事件-不要更换默认名字--拖入不会触发重新改名的函数---无用
void dragEnterEvent(QDragEnterEvent *event);//拖入--系统默认的名字--拖动生效
void dropEvent(QDropEvent *event);//释放事件--系统默认的名字--拖动生效
};
#endif // MAINWINDOW_MYDRAGDROP_H
#include "mainwindow_mydragdrop.h"
#include "ui_mainwindow_mydragdrop.h"
#include
#include
#include
#include
#include
#include
MainWindow_mydragdrop::MainWindow_mydragdrop(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow_mydragdrop)
{
ui->setupUi(this);
setAcceptDrops(true);
}
MainWindow_mydragdrop::~MainWindow_mydragdrop()
{
delete ui;
}
void MainWindow_mydragdrop::dragEnterEvent(QDragEnterEvent *event)
{
if(event->mimeData()->hasUrls())//数据中是否包含URL
{
event->acceptProposedAction();//接受动作
}
else
{
event->ignore();//忽略该事件
qDebug()setText("1a");
const QMimeData * q_mimedata=event->mimeData();//获取MIME的数据
if(q_mimedata->hasUrls())
{
QList url_list= q_mimedata->urls(); //获取URL列表
foreach(QUrl aa,url_list)
{
qDebug()setText(in.readAll());//读取流对象的内容
}
else
{
qDebug()hasUrls())//数据中是否包含URL
{
drag_event->acceptProposedAction();//接受动作
}
else
{
drag_event->ignore();//忽略该事件
}
}
void MainWindow_mydragdrop::dragReleaseEvent2(QDropEvent *release_event)//释放事件
{
ui->textEdit->setText("1a");
const QMimeData * q_mimedata=release_event->mimeData();//获取MIME的数据
if(q_mimedata->hasUrls())
{
QList url_list= q_mimedata->urls(); //获取URL列表
foreach(QUrl aa,url_list)
{
qDebug()setText(in.readAll());//读取流对象的内容
}
}
}