QT實現拖放文件(有例子,並且圖文並茂,非常清楚)


轉自:http://my.oschina.net/voler/blog/345722

 

0. 源代碼下載地址

1. 簡單文件拖放

 

https://github.com/leichaojian/qt/tree/master/drop1

2. 復雜文件拖放

https://github.com/leichaojian/qt/tree/master/drop

3. 通過按鈕來完成列表數據的轉移

https://github.com/leichaojian/qt/tree/master/drop3

4. 通過拖放文件來達到效果

https://github.com/leichaojian/qt/tree/master/drop4

 

 

1. 簡單文件拖放

1. 一般情況下,編輯框可以直接接收到文件名

 

?
1
2
3
4
5
6
7
8
MainWindow::MainWindow(QWidget *parent) :
     QMainWindow(parent),
     ui( new  Ui::MainWindow)
{
     ui->setupUi( this );
     textEdit =  new  QTextEdit;
     setCentralWidget(textEdit);
}

 

 

2. 程序效果圖

 

2. 復雜文件拖放

    如果我們想在主框架中得到響應的文件信息,則我們必須親自實現文件拖放操作。

1. 關鍵代碼如下

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//當用戶拖動文件到窗口部件上時候,就會觸發dragEnterEvent事件
void  MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
     //如果為文件,則支持拖放
     if  (event->mimeData()->hasFormat( "text/uri-list" ))
         event->acceptProposedAction();
}
 
//當用戶放下這個文件后,就會觸發dropEvent事件
void  MainWindow::dropEvent(QDropEvent *event)
{
     //注意:這里如果有多文件存在,意思是用戶一下子拖動了多個文件,而不是拖動一個目錄
     //如果想讀取整個目錄,則在不同的操作平台下,自己編寫函數實現讀取整個目錄文件名
     QList<QUrl> urls = event->mimeData()->urls();
     if (urls.isEmpty())
         return ;
 
     //往文本框中追加文件名
     foreach(QUrl url, urls) {
         QString file_name = url.toLocalFile();
         textEdit->append(file_name);
     }
}

 

 

2. 程序效果圖

 

3. 通過按鈕來完成列表數據的轉移

1. 關鍵代碼

 

?
1
2
3
4
5
6
7
8
9
10
void  Dialog::moveCurrentItem(QListWidget *source,
                      QListWidget *target)
{
     if  (source->currentItem()) {
         QListWidgetItem *newItem = source->currentItem()->clone();
         target->addItem(newItem);
         target->setCurrentItem(newItem);
         delete  source->currentItem();
     }
}

 

 

2. 程序效果圖

 

4. 通過拖放文件來達到效果

1. 關鍵代碼

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
void  ProjectListWidget::mousePressEvent(QMouseEvent *event)
{
     //獲取鼠標按下時候的坐標
     if  (event->button() == Qt::LeftButton)
         startPos = event->pos();
     QListWidget::mousePressEvent(event);
}
 
void  ProjectListWidget::mouseMoveEvent(QMouseEvent *event)
{
     if  (event->buttons() & Qt::LeftButton) {
         int  distance = (event->pos() - startPos).manhattanLength();
         //如果長度大於推薦的拖動起始距離,則認為是拖動(存在用戶手抖的情況)
         if  (distance >= QApplication::startDragDistance())
             performDrag();
     }
     QListWidget::mouseMoveEvent(event);
}
 
//有文件拖動到窗口上時,觸發此dragEnterEvent事件
void  ProjectListWidget::dragEnterEvent(QDragEnterEvent *event)
{
     //當為同一個應用程序的一部分時,event->source()返回啟動這個拖動窗口部件的指針
     ProjectListWidget *source =
             qobject_cast<ProjectListWidget *>(event->source());
     if  (source && source !=  this ) {
         //確認是一個移動的操作
         event->setDropAction(Qt::MoveAction);
         event->accept();
     }
}
 
void  ProjectListWidget::dragMoveEvent(QDragMoveEvent *event)
{
     ProjectListWidget *source =
             qobject_cast<ProjectListWidget *>(event->source());
     if  (source && source !=  this ) {
         event->setDropAction(Qt::MoveAction);
         event->accept();
     }
}
 
void  ProjectListWidget::dropEvent(QDropEvent *event)
{
     ProjectListWidget *source =
             qobject_cast<ProjectListWidget *>(event->source());
     if  (source && source !=  this ) {
         //得到數據並增加到列表中
         addItem(event->mimeData()->text());
         event->setDropAction(Qt::MoveAction);
         event->accept();
     }
}
 
void  ProjectListWidget::performDrag()
{
     //當前被拖動的選項
     QListWidgetItem *item = currentItem();
     if  (item) {
         QMimeData *mimeData =  new  QMimeData;
         mimeData->setText(item->text());
 
         QDrag *drag =  new  QDrag( this );
         drag->setMimeData(mimeData);
         drag->setPixmap(QPixmap( ":/images/person.png" ));
         //進行拖動操作
         if  (drag->exec(Qt::MoveAction) == Qt::MoveAction)
             delete  item;
     }
}

 

 

2. 效果圖(通過鼠標拖放)

 

http://blog.csdn.net/emdfans/article/details/41721955


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM