2014-11-05 116 views
2

我可以成功拖放拖動對象到任何應用程序,但拖動多個項目的正確方法是什麼?在Qt中拖放多個對象

//Create Drag Object 
QDrag *drag = new QDrag(this); 
QMimeData *mimeData = new QMimeData; 
QImage myImage = QImage(currentPath); 
drag->setPixmap(QPixmap::fromImage(myImage, Qt::AutoColor)); 

//Send Source File to Target Application 
mimeData->setText(this->getPathToSource()); 
drag->setMimeData(mimeData); 

//Start drag/drop operation 
drag->exec(); 
+0

這取決於什麼對象和你想拖動的地方。 – Ezee 2014-11-05 11:43:58

回答

3

剪貼板一次只能包含一個對象。但是這個對象可以以不同的格式存儲。

例如,文檔可以同時存儲爲文本,如HTML和Doc。

將拖動光標移到應用程序上時,它會檢查是否可以使用可用格式和(很少)數據來刪除對象。

如果您需要拖動多個對象,則需要使用mimeData->setData(mimeType, data)將描述對象的數據放置在剪貼板中。
其中mimeType是唯一的QString,例如「mydatatype」。
dataQByteArray有關對象(或對象內容)的信息。例如,QStringList可以存儲如下:

QStringList list; 
mimeData->setData("myapplication::stringlist", list.join(",").toUtf8()); 

這裏是反序列化:

if (mimeData->hasFormat("myapplication::stringlist")) 
{ 
    QStringList list = QString::fromUtf8(mimeData->data("myapplication::stringlist")).split(","); 
} 

當然,你將無法在另一個(不是你的)應用程序丟棄這些數據。

編輯:
當您從Windows資源管理器拖動文件時,它將路徑放入剪貼板中的文件。
所以,如果你想拖動實例2的圖像,你必須將它們保存在臨時文件夾中以使用這種方式。

Windows資源管理器將一些MIME類型放置到剪貼板。我認爲你可以使用的是text/uri-list。這是一個文件名列表。每個文件名都有格式file:///path。每個文件名都從一個新行開始。

+0

那就是問題,我沒有控制目標應用程序。但在目標應用程序中,當我從Windwos Explorer中拖放兩個圖像時,它可以正常工作......可能是什麼樣的mime類型? – user1767754 2014-11-05 14:18:13

+0

已被添加到答案 – Ezee 2014-11-05 15:05:55

+0

這不是我正在尋找的東西,但是這些信息幫助我解決了我的問題,以後我會嘗試在您的答案中添加我的解決方案。 – user1767754 2014-11-11 21:53:41