轉自: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