您好,登錄后才能下訂單哦!
本篇內容主要講解“Qt拽拖框架有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Qt拽拖框架有哪些”吧!
??
??
??
?? ??
<br>
??拖放提供了一種簡單的可視機制,用戶可以使用它在應用程序之間和內部傳輸信息。拖放的功能類似于剪貼板的剪切和粘貼機制。 ??本文檔描述了基本的拖放機制,并概述了在自定義控件中啟用該機制的方法。許多qt的控件也支持拖放操作,例如項目視圖和圖形視圖框架,以及為qt小部件和qt quick編輯控件。有關項目視圖和圖形視圖的詳細信息,請參見使用項目視圖和圖形視圖框架的拖放。
<br>
??這些類處理拖放和必要的mime類型編碼和解碼。 ??
<br>
??QStyleHints對象提供了一些與拖放操作相關的屬性:
QStyleHints::startDragTime():描述在開始拖動之前,用戶必須在對象上按住鼠標按鈕的時間量(毫秒)。
QStyleHints::StartDragDistance():表示在移動被解釋為拖動之前,按住鼠標按鈕時用戶必須移動鼠標的距離。
QStyleHints::StartDragVelocity():表示用戶移動鼠標開始拖動的速度(以像素/秒為單位)。值為0表示沒有這樣的限制。 ??如果在控件中提供拖放支持,這些數量將提供與基礎窗口系統兼容的合理默認值,供您使用。
<br>
??文檔的其余部分主要關注如何在C++中實現拖放。要在Qt快速場景中使用拖放,請閱讀Qt Quick拖放、DragEvent和DropArea項的文檔,以及Qt快速拖放示例。
<br>
??要開始拖動,請創建一個QDrag對象,并調用其exec()函數。在大多數應用程序中,只有在按下鼠標按鈕并移動光標一定距離后,才能開始拖放操作。但是,啟用小部件拖動最簡單方法是重新實現小部件的mousePressEvent(),并啟動拖放操作: ?? ??盡管用戶可能需要一些時間來完成拖動操作,但就應用程序而言,exec()函數是一個帶有多個值之一的阻塞函數。這些說明操作是如何結束的,下面將詳細介紹。 ??注意,exec()函數不會阻塞主事件循環。 ??對于需要區分鼠標單擊和拖動的小部件,重新實現小部件的mousePressEvent()函數以記錄拖動的開始位置是很有用的: ??
??稍后,在mouseMoveEvent()中,我們可以確定是否應該開始拖動,并構造一個拖動對象來處理該操作: ??
??這種特殊的方法使用QPoint::manhattanlength()函數粗略估計鼠標單擊位置和當前光標位置之間的距離。此函數以精度換取速度,通常適用于此目的。
<br>
??要能夠接收小部件上丟棄的媒體,請為小部件調用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(),以防止基類提供默認的拖放處理,并處理您感興趣的任何特殊情況。
<br>
??在最簡單的情況下,拖放操作的目標將接收正在拖動的數據的副本,源將決定是否刪除原始數據。這由CopyAction操作描述。目標還可以選擇處理其他操作,特別是MoveAction和LinkAction操作。如果源調用QDrag::exec(),并返回MoveAction,則如果源選擇刪除任何原始數據,則該源將負責刪除。不應刪除源小部件創建的QMimeData和QDrag對象-它們將被Qt銷毀。 目標負責獲取在拖放操作中發送的數據的所有權;這通常通過保留對數據的引用來實現。 ??如果目標理解LinkAction操作,它應該存儲自己對原始信息的引用;源不需要對數據執行任何進一步的處理。拖放操作的最常見用法是在同一個小部件中執行移動;有關此功能的詳細信息,請參閱有關拖放操作的部分。 ??拖動操作的另一個主要用途是在使用引用類型(如text/uri-list)時,其中拖動的數據實際上是對文件或對象的引用。
<br>
??拖放不限于文本和圖像。任何類型的信息都可以在拖放操作中傳輸。要在應用程序之間拖動信息, 應用程序必須能夠相互指示可以接受哪些數據格式以及可以生成哪些數據格式,這是通過使用mime類型實現的。 由源構造的QDrag對象包含一個用于表示數據的mime類型列表(從最合適的到最不合適的順序排列),drop目標使用其中一個來訪問數據。對于常見的數據類型,便利函數處理透明使用的mime類型,但是對于自定義數據類型,必須顯式地聲明它們。 ??要對QDrag便利功能未涵蓋的信息類型執行拖放操作,第一步也是最重要的一步是查找適當的現有格式:Internet分配號碼管理局(IANA)在信息科學研究所(ISI)提供了MIME媒體類型的分層列表。使用標準的mime類型可以最大限度地提高應用程序與其他軟件現在和將來的互操作性。 要支持其他媒體類型,只需使用setData()函數設置QMimeData對象中的數據,提供完整的mime類型和以適當格式包含數據的QByteArray。以下代碼從標簽中獲取QPixmap,并將其存儲為QMimeData對象中的可移植網絡圖形(PNG)文件: ??
??對于這種情況,我們可以簡單地使用setImageData()來提供各種格式的圖像數據: ??
??在這種情況下,QByteArray方法仍然很有用,因為它可以更好地控制QMimeData對象中存儲的數據量。 請注意,在項視圖中使用的自定義數據類型必須聲明為元對象,并且必須實現它們的流運算符。
<br>
??在剪貼板模型中,用戶可以剪切或復制源信息,然后粘貼它。同樣,在拖放模型中,用戶可以拖動信息的副本,也可以將信息本身拖動到新位置(移動信息)。拖放模型對于程序員來說還有一個額外的復雜之處:在操作完成之前,程序不知道用戶是否想要剪切或復制信息。在應用程序之間拖動信息時,這通常沒有什么區別,但在應用程序中,檢查使用了哪個放置操作是很重要的。 ??可以為一個小部件重新實現mouseMoveEvent(),并通過可能的拖放操作組合啟動拖放操作。例如,可能希望確保拖動始終移動小部件中的對象: ??
??如果信息被放到另一個應用程序中,exec()函數返回的操作可能默認為copyAction,但是如果信息被放到同一個應用程序中的另一個小部件中,我們可能會獲得不同的drop操作。 可以在小部件的dragMoveEvent()函數中篩選建議的放置操作。但是,可以接受DragEnterEvent()中所有建議的操作,并讓用戶稍后決定要接受哪個操作: ??
??當小部件中發生放置時,將調用DropEvent()處理程序函數,我們可以依次處理每個可能的操作。首先,我們在同一個小部件中處理拖放操作: ??
??在這種情況下,拒絕處理移動操作。接受的每種類型的跌落動作都會進行相應的檢查和處理: ??
??注意,在上面的代碼中檢查了單獨的放置操作。如上所述,在覆蓋建議的操作部分,有時需要覆蓋建議的刪除操作,并從可能的刪除操作中選擇不同的操作。為此,需要檢查事件的possibleActions()提供的值中是否存在每個操作,使用setDropAction()設置Drop操作,并調用accept()。
<br>
??小部件的dragMoveEvent()可用于通過僅在光標位于這些區域內時接受建議的放置操作來限制小部件的某些部分的放置。例如,當光標位于子小部件(DropFrame)上時,以下代碼接受任何建議的放置操作: ??
??如果您需要在拖放操作期間提供視覺反饋、滾動窗口或任何適當的操作,也可以使用DragMoveEvent()。
<br>
??應用程序還可以通過將數據放在剪貼板上進行通信。要訪問這個,您需要從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來注冊。
到此,相信大家對“Qt拽拖框架有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。