Qt学习之路(52): 拖放技术之一
生活随笔
收集整理的這篇文章主要介紹了
Qt学习之路(52): 拖放技术之一
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
拖放 Drag and Drop,有時又被稱為 DnD,是現(xiàn)代軟件開發(fā)中必不可少的一項技術(shù)。它提供了一種能夠在應(yīng)用程序內(nèi)部甚至是應(yīng)用程序之間進行信息交換的機制,并且,操作系統(tǒng)與應(yīng)用程序之間進行剪貼板的內(nèi)容交換,也可以被認(rèn)為是 DnD 的一部分。 DnD 其實是由兩部分組成的:Drag 和 Drop。Drag 是將被拖放對象“拖動”,Drop 是將被拖放對象“放下”,前者一般是一個按下鼠標(biāo)的過程,而后者則是一個松開鼠標(biāo)的過程,這兩者之間鼠標(biāo)一直是被按下的。當(dāng)然,這只是一種通常的情況,其他情況還是要看應(yīng)用程序的具體實現(xiàn)。對于 Qt 而言,widget既可以作為 drag 對象,也可以作為 drop 對象,或者二者都是。 下面的一個例子來自 C++ GUI Programming with Qt 4, 2nd Edition。在這個例子中,我們創(chuàng)建一個程序,可以將系統(tǒng)中的文本文件拖放過來,然后在窗口中讀取內(nèi)容。 mainwindow.h #ifndef?MAINWINDOW_H ? #define?MAINWINDOW_H ? ? #include?<QtGui> ? ? class?MainWindow?:?public?QMainWindow ? { ? ????Q_OBJECT ? ? public: ? ????MainWindow(QWidget?*parent?=?0); ? ????~MainWindow(); ? ? protected: ? ????void?dragEnterEvent(QDragEnterEvent?*event); ? ????void?dropEvent(QDropEvent?*event); ? ? private: ? ????bool?readFile(const?QString?&fileName); ? ????QTextEdit?*textEdit; ? }; ? ? #endif?//?MAINWINDOW_H? mainwindow.cpp #include?"mainwindow.h" ? ? MainWindow::MainWindow(QWidget?*parent) ? ????:?QMainWindow(parent) ? { ? ????textEdit?=?new?QTextEdit; ? ????setCentralWidget(textEdit); ? ? ????textEdit->setAcceptDrops(false); ? ????setAcceptDrops(true); ? ? ????setWindowTitle(tr("Text?Editor")); ? } ? ? MainWindow::~MainWindow() ? { ? } ? ? void?MainWindow::dragEnterEvent(QDragEnterEvent?*event) ? { ? ????if?(event->mimeData()->hasFormat("text/uri-list"))?{ ? ????????event->acceptProposedAction(); ? ????} ? } ? ? void?MainWindow::dropEvent(QDropEvent?*event) ? { ? ????QList<QUrl>?urls?=?event->mimeData()->urls(); ? ????if?(urls.isEmpty())?{ ? ????????return; ? ????} ? ? ????QString?fileName?=?urls.first().toLocalFile(); ? ????if?(fileName.isEmpty())?{ ? ????????return; ? ????} ? ? ????if?(readFile(fileName))?{ ? ????????setWindowTitle(tr("%1?-?%2").arg(fileName,?tr("Drag?File"))); ? ????} ? } ? ? bool?MainWindow::readFile(const?QString?&fileName) ? { ? ????bool?r?=?false; ? ????QFile?file(fileName); ? ????QTextStream?in(&file); ? ????QString?content; ? ????if(file.open(QIODevice::ReadOnly))?{ ? ????????in?>>?content; ? ????????r?=?true; ? ????} ? ????textEdit->setText(content); ? ????return?r; ? }? main.cpp #include?<QtGui/QApplication> ? #include?"mainwindow.h" ? ? int?main(int?argc,?char?*argv[]) ? { ? ????QApplication?a(argc,?argv); ? ????MainWindow?w; ? ????w.show(); ? ????return?a.exec(); ? }? 這里的代碼并不是很復(fù)雜。在MainWindow中,一個QTextEdit作為窗口中間的widget。這個類中有兩個protected的函數(shù):dragEnterEvent() 和 dropEvent(),這兩個函數(shù)都是繼承自 QWidget,看它們的名字就知道這是兩個事件,而不僅僅是signal。 在構(gòu)造函數(shù)中,我們創(chuàng)建了 QTextEdit 的對象。默認(rèn)情況下,QTextEdit 可以接受從其他的應(yīng)用程序拖放過來的文本類型的信息。如果用戶把一個文件拖到這里面,那么就會把文件名插入到文本的當(dāng)前位置。但是我們希望讓MainWindow 讀取文件內(nèi)容,而不僅僅是插入文件名,所以我們在MainWindow中對 drop 事件進行了處理,因此要把QTextEdit的setAcceptDrops()函數(shù)置為false,并且把MainWindow的setAcceptDrops()置為true,以便讓MainWindow對 drop 事件進行處理。 當(dāng)用戶將對象拖動到組件上面時,dragEnterEvent()函數(shù)會被回調(diào)。如果我們在事件處理代碼中調(diào)用 acceptProposeAction() 函數(shù),我們就可以向用戶暗示,你可以將拖動的對象放在這個組件上。默認(rèn)情況下,組件是不會接受拖放的。如果我們調(diào)用了這樣的函數(shù),那么Qt會自動地以光標(biāo)來提示用戶是否可以將對象放在組件上。在這里,我們希望告訴用戶,窗口可以接受拖放。因此,我們首先檢查拖放的MIME類型。MIME類型為 text/uri-list 通常用來描述一個 URI 的列表。這些 URI 可以是文件名,可以是 URL或者其他的資源描述符。MIME類型由 Internet Assigned Numbers Authority (IANA) 定義,Qt 的拖放事件使用MIME類型來判斷拖放對象的類型。關(guān)于 MIME類型的詳細(xì)信息,請參考?http://www.iana.org/assignments/media-types/. 當(dāng)用戶將對象釋放到組件上面時,dropEvent() 函數(shù)會被回調(diào)。我們使用 QMimeData::urls()來或者 QUrl 的一個list。通常,這種拖動應(yīng)該只用一個文件,但是也不排除多個文件一起拖動。因此我們需要檢查這個list是否為空,如果不為空,則取出第一個。如果不成立,則立即返回。最后我們調(diào)用 readFile() 函數(shù)讀取文件內(nèi)容。關(guān)于讀取操作我們會在以后的章節(jié)中詳細(xì)說明,這里不再贅述。 好了,至此我們的小程序就解釋完畢了,運行一下看看效果吧! 對于拖動和脫離,Qt 也提供了類似的函數(shù):dragMoveEvent() 和 dragLeaveEvent(),不過對于大部分應(yīng)用而言,這兩個函數(shù)的使用率要小得多。
本文轉(zhuǎn)自 FinderCheng 51CTO博客,原文鏈接:http://blog.51cto.com/devbean/280052
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
本文轉(zhuǎn)自 FinderCheng 51CTO博客,原文鏈接:http://blog.51cto.com/devbean/280052
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
以上是生活随笔為你收集整理的Qt学习之路(52): 拖放技术之一的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spark内核以及源码解析
- 下一篇: my02_Atlas mysql5.7安