qt 拖放dropEvent


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);
}

 


免責聲明!

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



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