1.拖放操作分為兩個截然不同的動作: 拖動和放下.
拖動通過 void dragEnterEvent(QDragEnterEvent * event); 來實現。
放下通過 void dropEvent(QDropEvent * event); 來實現。
需要注意的一個地方是:
默認情況下,QTextEdit可以接受來自其他應用程序文本的拖動,並且如果用戶在它上面拖放下一個文件,它會把這個文件的文件名放到QTextEdit的文本框中.
所以當我們使用拖放的時候,應該先禁用QTextEdit的可拖放.
this->textEdit->setAcceptDrops(false); this->mainWindow->setAcceptDrops(true);
2.當用戶把一個對象拖動到這個指定窗口上時,應付調用dragEnterEvent.如果對這個事件調用acceptProposedAction(),就表明用戶可以在這個窗口部件上拖放對象。
默認情況下,窗口部件是不接受拖動的。Qt會自動改變光標來向用戶說明這個窗口部件是不是有效的放下點。
void Test::dragEnterEvent(QDragEnterEvent *ev)
{if(ev->mimeData()->hasFormat("text/uri-list"))
ev->acceptProposedAction();
}
這個地方有個問題,首先看下書本上是怎么說的:
MIME類型中的text/uri-list用於存儲一系列的統一資源標識符(Universal Resource Identifier,URI),
它們可以是文件名、統一資源定位器(Uniform Resource Locator,URL,如HTTP或者FTP路徑),或者其它全局資源標識符。
但是這個地方,並不能使用text/plain來判斷txt文件 用image/jpeg來判斷圖片。
因為通過下面的代碼,可以發現jpeg格式的圖片返回fromat也是text/uri-list.
qDebug()<<ev->mimeData()->formats();
而且debug顯示的也沒有image/jpeg
這個是我不能理解的,這也就是說,在dragEnterEvent中只能判斷到是不是文件,而不能判斷到類型。不知道我的判斷是不是正確的。
3.當用戶在窗口部件上放下一個對象時,就會調用dropEvent.
void Test::dropEvent(QDropEvent *ev) { QList<QUrl> urls = ev->mimeData()->urls(); QString filename = urls.first().toLocalFile(); this->fnames = filename; this->readFile(fnames); }
