Qt開發技術:Qt拽拖開發(一)拽託框架詳解及Demo

若該文爲原創文章,轉載請註明原文出處
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/116292217 程序員

紅胖子(紅模仿)的博文大全:開發技術集合(包含Qt實用技術、樹莓派、三維、OpenCV、OpenGL、ffmpeg、OSG、單片機、軟硬結合等等)持續更新中…(點擊傳送門)網絡

Qt開發專欄:開發技術(點擊傳送門)


上一篇:沒有了
下一篇:敬請期待...框架


前話

  Qt中的拽拖操做詳細介紹。函數


Demo

圖片拽拖

  在這裏插入圖片描述

控件拽拖

  在這裏插入圖片描述

窗口拽拖

  在這裏插入圖片描述

拽託框架(高級開發)

  在這裏插入圖片描述
  在這裏插入圖片描述


拖放(Drag and Drop)

  拖放提供了一種簡單的可視機制,用戶可使用它在應用程序之間和內部傳輸信息。拖放的功能相似於剪貼板的剪切和粘貼機制。
  本文檔描述了基本的拖放機制,並概述了在自定義控件中啓用該機制的方法。許多qt的控件也支持拖放操做,例如項目視圖和圖形視圖框架,以及爲qt小部件和qt quick編輯控件。有關項目視圖和圖形視圖的詳細信息,請參見使用項目視圖和圖形視圖框架的拖放。ui


拖放類

  這些類處理拖放和必要的mime類型編碼和解碼。
  在這裏插入圖片描述編碼


配置

  QStyleHints對象提供了一些與拖放操做相關的屬性:spa

  • QStyleHints::startDragTime():描述在開始拖動以前,用戶必須在對象上按住鼠標按鈕的時間量(毫秒)。
  • QStyleHints::StartDragDistance():表示在移動被解釋爲拖動以前,按住鼠標按鈕時用戶必須移動鼠標的距離。
  • QStyleHints::StartDragVelocity():表示用戶移動鼠標開始拖動的速度(以像素/秒爲單位)。值爲0表示沒有這樣的限制。

  若是在控件中提供拖放支持,這些數量將提供與基礎窗口系統兼容的合理默認值,供您使用。.net


在Qt Quick種的拖放

  文檔的其他部分主要關注如何在C++中實現拖放。要在Qt快速場景中使用拖放,請閱讀Qt Quick拖放、DragEvent和DropArea項的文檔,以及Qt快速拖放示例。翻譯


拖曳(Dragging)

  要開始拖動,請建立一個QDrag對象,並調用其exec()函數。在大多數應用程序中,只有在按下鼠標按鈕並移動光標必定距離後,才能開始拖放操做。可是,啓用小部件拖動最簡單方法是從新實現小部件的mousePressEvent(),並啓動拖放操做:
  在這裏插入圖片描述
  儘管用戶可能須要一些時間來完成拖動操做,但就應用程序而言,exec()函數是一個帶有多個值之一的阻塞函數。這些說明操做是如何結束的,下面將詳細介紹。
  注意,exec()函數不會阻塞主事件循環。
  對於須要區分鼠標單擊和拖動的小部件,從新實現小部件的mousePressEvent()函數以記錄拖動的開始位置是頗有用的:
  在這裏插入圖片描述對象

  稍後,在mouseMoveEvent()中,咱們能夠肯定是否應該開始拖動,並構造一個拖動對象來處理該操做:
  在這裏插入圖片描述

  這種特殊的方法使用QPoint::manhattanlength()函數粗略估計鼠標單擊位置和當前光標位置之間的距離。此函數以精度換取速度,一般適用於此目的。


放下(Dropping)

  要可以接收小部件上丟棄的媒體,請爲小部件調用setAcceptDrops(true),並從新實現dragEnterEvent()和dropEvent()事件處理程序函數。
例如,如下代碼啓用了QWidget子類的構造函數中的Drop事件,從而能夠有效地實現Drop事件處理程序:
  dragEnterEvent()一般用於通知qt小部件接受的數據類型。若是要在DragMoveEvent()和dropEvent()的從新實現中接收QDragMoveEvent或QDropEvent,則必須從新實現此函數。
報錯
  下面的代碼顯示如何從新實現DragEnterEvent(),以告訴拖放系統咱們只能處理純文本:
   在這裏插入圖片描述

  dropEvent()用於解包丟棄的數據,並以適合您的應用程序的方式對其進行處理。
  在如下代碼中,事件中提供的文本將傳遞給QTextBrowser,QComboBox將填充用於描述數據的mime類型列表:
  在這裏插入圖片描述

  在這種狀況下,咱們接受建議的操做,而不檢查它是什麼。在實際應用程序中,可能須要從dropEvent()函數返回,而不接受建議的操做,或者在操做不相關的狀況下處理數據。例如,若是咱們不支持到應用程序中外部源的連接,咱們能夠選擇忽略Qt::LinkAction操做。

覆蓋提議的行動

  也能夠忽略提議的操做,並對數據執行其餘操做。爲此,咱們將在調用accept()以前使用Qt::dropAction中的首選操做調用事件對象的setDropAction()。這樣能夠確保使用替換刪除操做而不是建議的操做。
對於更復雜的應用程序,從新實現dragMoveEvent()和dragLeaveEvent()將使小部件的某些部分對放置事件敏感,並使您可以更好地控制應用程序中的拖放。

複雜小部件的子類化

  某些標準Qt小部件爲拖放提供了本身的支持。在對這些小部件進行子類化時,除了DragCenterEvent()和DropEvent()以外,可能還須要從新實現DragMoveEvent(),以防止基類提供默認的拖放處理,並處理您感興趣的任何特殊狀況。


拖放操做

  在最簡單的狀況下,拖放操做的目標將接收正在拖動的數據的副本,源將決定是否刪除原始數據。這由CopyAction操做描述。目標還能夠選擇處理其餘操做,特別是MoveActionLinkAction操做。若是源調用QDrag::exec(),並返回MoveAction,則若是源選擇刪除任何原始數據,則該源將負責刪除。不該刪除源小部件建立的QMimeData和QDrag對象-它們將被Qt銷燬。 目標負責獲取在拖放操做中發送的數據的全部權;這一般經過保留對數據的引用來實現。
  若是目標理解LinkAction操做,它應該存儲本身對原始信息的引用;源不須要對數據執行任何進一步的處理。拖放操做的最多見用法是在同一個小部件中執行移動;有關此功能的詳細信息,請參閱有關拖放操做的部分。
  拖動操做的另外一個主要用途是在使用引用類型(如text/uri-list)時,其中拖動的數據其實是對文件或對象的引用。


添加新的拖放類型

  拖放不限於文本和圖像。任何類型的信息均可以在拖放操做中傳輸。要在應用程序之間拖動信息, 應用程序必須可以相互指示能夠接受哪些數據格式以及能夠生成哪些數據格式,這是經過使用mime類型實現的。 由源構造的QDrag對象包含一個用於表示數據的mime類型列表(從最合適的到最不合適的順序排列),drop目標使用其中一個來訪問數據。對於常見的數據類型,便利函數處理透明使用的mime類型,可是對於自定義數據類型,必須顯式地聲明它們。
  要對QDrag便利功能未涵蓋的信息類型執行拖放操做,第一步也是最重要的一步是查找適當的現有格式:Internet分配號碼管理局(IANA)在信息科學研究所(ISI)提供了MIME媒體類型的分層列表。使用標準的mime類型能夠最大限度地提升應用程序與其餘軟件如今和未來的互操做性。
要支持其餘媒體類型,只需使用setData()函數設置QMimeData對象中的數據,提供完整的mime類型和以適當格式包含數據的QByteArray。如下代碼從標籤中獲取QPixmap,並將其存儲爲QMimeData對象中的可移植網絡圖形(PNG)文件:
  在這裏插入圖片描述

  對於這種狀況,咱們能夠簡單地使用setImageData()來提供各類格式的圖像數據:
  在這裏插入圖片描述

  在這種狀況下,QByteArray方法仍然頗有用,由於它能夠更好地控制QMimeData對象中存儲的數據量。
請注意,在項視圖中使用的自定義數據類型必須聲明爲元對象,而且必須實現它們的流運算符。


放下動做

  在剪貼板模型中,用戶能夠剪切或複製源信息,而後粘貼它。一樣,在拖放模型中,用戶能夠拖動信息的副本,也能夠將信息自己拖動到新位置(移動信息)。拖放模型對於程序員來講還有一個額外的複雜之處:在操做完成以前,程序不知道用戶是否想要剪切或複製信息。在應用程序之間拖動信息時,這一般沒有什麼區別,但在應用程序中,檢查使用了哪一個放置操做是很重要的。
  能夠爲一個小部件從新實現mouseMoveEvent(),並經過可能的拖放操做組合啓動拖放操做。例如,可能但願確保拖動始終移動小部件中的對象:
  在這裏插入圖片描述

  若是信息被放到另外一個應用程序中,exec()函數返回的操做可能默認爲copyAction,可是若是信息被放到同一個應用程序中的另外一個小部件中,咱們可能會得到不一樣的drop操做。
能夠在小部件的dragMoveEvent()函數中篩選建議的放置操做。可是,能夠接受DragEnterEvent()中全部建議的操做,並讓用戶稍後決定要接受哪一個操做:
  在這裏插入圖片描述

  當小部件中發生放置時,將調用DropEvent()處理程序函數,咱們能夠依次處理每一個可能的操做。首先,咱們在同一個小部件中處理拖放操做:
  在這裏插入圖片描述

  在這種狀況下,拒絕處理移動操做。接受的每種類型的跌落動做都會進行相應的檢查和處理:
  在這裏插入圖片描述

  注意,在上面的代碼中檢查了單獨的放置操做。如上所述,在覆蓋建議的操做部分,有時須要覆蓋建議的刪除操做,並從可能的刪除操做中選擇不一樣的操做。爲此,須要檢查事件的possibleActions()提供的值中是否存在每一個操做,使用setDropAction()設置Drop操做,並調用accept()。


矩形下落

  小部件的dragMoveEvent()可用於經過僅在光標位於這些區域內時接受建議的放置操做來限制小部件的某些部分的放置。例如,當光標位於子小部件(DropFrame)上時,如下代碼接受任何建議的放置操做:
  在這裏插入圖片描述

  若是您須要在拖放操做期間提供視覺反饋、滾動窗口或任何適當的操做,也可使用DragMoveEvent()。


剪切板

  應用程序還能夠經過將數據放在剪貼板上進行通訊。要訪問這個,您須要從QApplication對象獲取一個QClipboard對象。
  QMimedata類用於表示在剪貼板中傳輸的數據。要將數據放在剪貼板上,可使用setText()、setImage()和setPixmap()方便函數來處理常見的數據類型。這些函數與在QMimedata類中找到的函數相似,只是它們還帶有一個控制數據存儲位置的附加參數:若是指定了剪貼板,則數據將放置在剪貼板上;若是指定了選擇,則數據將放置在鼠標選擇中(僅在x11上)。默認狀況下,數據放在剪貼板上。
例如,咱們可使用如下代碼將QLineEdit的內容複製到剪貼板:

  具備不一樣mime類型的數據也能夠放在剪貼板上。構造一個qmimedata對象,並使用setData()函數按照前面部分描述的方式設置數據;而後可使用setmimedata()函數將該對象放到剪貼板上。
QClipboard類能夠經過其dataChanged()信號通知應用程序它所包含的數據的更改。例如,咱們能夠經過將此信號鏈接到小部件中的插槽來監視剪貼板:
  在這裏插入圖片描述

  鏈接到此信號的插槽可使用可用於表示該信號的MIME類型之一讀取剪貼板上的數據:
  在這裏插入圖片描述
  selectionChanged()信號可用於x11以監視鼠標選擇。

與其餘應用程序互操做

  在x11上,使用公共XDND協議,而在Windows Qt上使用OLE標準,而Qt for MacOS使用Cocoa拖動管理器。在x11, XDND使用MIME,所以不須要翻譯。不管平臺如何,QT API都是相同的。在Windows上,支持MIME的應用程序可使用MIME類型的剪貼板格式名稱進行通訊。一些Windows應用程序已經爲其剪貼板格式使用了MIME命名約定。
  用於轉換專用剪貼板格式的自定義類能夠經過在Windows上從新實現QwinMime或在MacOS上從新實現QMacPasteboardMime來註冊。


上一篇:沒有了
下一篇:敬請期待...


若該文爲原創文章,轉載請註明原文出處
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/116292217

相關文章
相關標籤/搜索