Qt拖放功能

mytextedit.h:

 1 #ifndef MYTEXTEDIT_H
 2 #define MYTEXTEDIT_H
 3 
 4 #include <QTextEdit>
 5 #include "ui_mytextedit.h"
 6 #include <QUrl>
 7 #include <QDropEvent>
 8 #include <QMimeData>
 9 #include <QString>
10 #include <QDragEnterEvent>
11 
12 class MyTextEdit : public QTextEdit
13 {
14     Q_OBJECT
15 
16 public:
17     MyTextEdit(QWidget *parent = 0);
18     ~MyTextEdit();
19 
20     //void dragEnterEvent(QDragEnterEvent *event);
21     void dropEvent(QDropEvent *event);
22 
23 private:
24     Ui::MyTextEdit ui;
25 };
26 
27 #endif // MYTEXTEDIT_H

 

 

mytextedit.cpp:

 1 #include "mytextedit.h"
 2 
 3 MyTextEdit::MyTextEdit(QWidget *parent)
 4     : QTextEdit(parent)
 5 {
 6     ui.setupUi(this);
 7 }
 8 
 9 MyTextEdit::~MyTextEdit()
10 {
11 
12 }
13 
14 void MyTextEdit::dropEvent(QDropEvent *event)
15 {
16     QList<QUrl> urls = event->mimeData()->urls();
17     if (urls.isEmpty())
18     {
19         return;
20     }
21 
22     //QUrl url = urls.back();
23     foreach(QUrl url, urls)
24     {
25         QString file_name = url.toLocalFile();
26         this->append(file_name);
27     }
28 }
29 
30 //void MyTextEdit::dragEnterEvent(QDragEnterEvent *event)
31 //{
32 //    if (event->mimeData()->hasFormat("text/uri-list"))
33 //        event->acceptProposedAction();
34 //}

 

 

上面为实现拖放文件,显示文件路径的自定义class MyTextEdit,发现函数void MyTextEdit::dragEnterEvent(QDragEnterEvent *event)注释掉但是功能没有影响,

将MyTextEdit文本框类去掉,换成QWidget类时,发现当把一个对象拖动到这个QWidget窗体上时,就会调用dragEnterEvent(),如果这个事件调用了acceptProposedAction(),就表明可以在这个窗体上拖放对象,

默认情况下窗口部件是不接受拖动的,因此,如果注释掉dragEnterEvent()函数,QWidget类上就不能实现拖放功能,qt会自动改变光标向用户说明这个窗口部件不是有效的放下点。重要的是,要在QWidget类上实现拖放,

首先需要设置setAcceptDrops(true)来接受放下事件。

 

如果想要在图形组件上启用拖放功能,可以使用QWidget上的setAcceptDrops()方法,设定组件接受拖放动作,在拖放动作发生时,会有相应的QDragEnterEvent、QDragMoveEvent、QDragLeaveEvent与QDropEvent等事件发生,可以重新定义dragEnterEvent()、dragMoveEvent()、dragLeaveEvent()、dropEvent()等事件处理,以处理相应的拖放事件,一般使用dragEnterEvent()和dropEvent()。

 

posted @ 2016-09-07 12:07  凯撒大猩猩  阅读(1165)  评论(0编辑  收藏  举报