您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Qt拽拖框架有哪些”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Qt拽拖框架有哪些”吧!
??
??
??
?? ??
<br>
??拖放提供了一種簡(jiǎn)單的可視機(jī)制,用戶(hù)可以使用它在應(yīng)用程序之間和內(nèi)部傳輸信息。拖放的功能類(lèi)似于剪貼板的剪切和粘貼機(jī)制。 ??本文檔描述了基本的拖放機(jī)制,并概述了在自定義控件中啟用該機(jī)制的方法。許多qt的控件也支持拖放操作,例如項(xiàng)目視圖和圖形視圖框架,以及為qt小部件和qt quick編輯控件。有關(guān)項(xiàng)目視圖和圖形視圖的詳細(xì)信息,請(qǐng)參見(jiàn)使用項(xiàng)目視圖和圖形視圖框架的拖放。
<br>
??這些類(lèi)處理拖放和必要的mime類(lèi)型編碼和解碼。 ??
<br>
??QStyleHints對(duì)象提供了一些與拖放操作相關(guān)的屬性:
QStyleHints::startDragTime():描述在開(kāi)始拖動(dòng)之前,用戶(hù)必須在對(duì)象上按住鼠標(biāo)按鈕的時(shí)間量(毫秒)。
QStyleHints::StartDragDistance():表示在移動(dòng)被解釋為拖動(dòng)之前,按住鼠標(biāo)按鈕時(shí)用戶(hù)必須移動(dòng)鼠標(biāo)的距離。
QStyleHints::StartDragVelocity():表示用戶(hù)移動(dòng)鼠標(biāo)開(kāi)始拖動(dòng)的速度(以像素/秒為單位)。值為0表示沒(méi)有這樣的限制。 ??如果在控件中提供拖放支持,這些數(shù)量將提供與基礎(chǔ)窗口系統(tǒng)兼容的合理默認(rèn)值,供您使用。
<br>
??文檔的其余部分主要關(guān)注如何在C++中實(shí)現(xiàn)拖放。要在Qt快速場(chǎng)景中使用拖放,請(qǐng)閱讀Qt Quick拖放、DragEvent和DropArea項(xiàng)的文檔,以及Qt快速拖放示例。
<br>
??要開(kāi)始拖動(dòng),請(qǐng)創(chuàng)建一個(gè)QDrag對(duì)象,并調(diào)用其exec()函數(shù)。在大多數(shù)應(yīng)用程序中,只有在按下鼠標(biāo)按鈕并移動(dòng)光標(biāo)一定距離后,才能開(kāi)始拖放操作。但是,啟用小部件拖動(dòng)最簡(jiǎn)單方法是重新實(shí)現(xiàn)小部件的mousePressEvent(),并啟動(dòng)拖放操作: ?? ??盡管用戶(hù)可能需要一些時(shí)間來(lái)完成拖動(dòng)操作,但就應(yīng)用程序而言,exec()函數(shù)是一個(gè)帶有多個(gè)值之一的阻塞函數(shù)。這些說(shuō)明操作是如何結(jié)束的,下面將詳細(xì)介紹。 ??注意,exec()函數(shù)不會(huì)阻塞主事件循環(huán)。 ??對(duì)于需要區(qū)分鼠標(biāo)單擊和拖動(dòng)的小部件,重新實(shí)現(xiàn)小部件的mousePressEvent()函數(shù)以記錄拖動(dòng)的開(kāi)始位置是很有用的: ??
??稍后,在mouseMoveEvent()中,我們可以確定是否應(yīng)該開(kāi)始拖動(dòng),并構(gòu)造一個(gè)拖動(dòng)對(duì)象來(lái)處理該操作: ??
??這種特殊的方法使用QPoint::manhattanlength()函數(shù)粗略估計(jì)鼠標(biāo)單擊位置和當(dāng)前光標(biāo)位置之間的距離。此函數(shù)以精度換取速度,通常適用于此目的。
<br>
??要能夠接收小部件上丟棄的媒體,請(qǐng)為小部件調(diào)用setAcceptDrops(true),并重新實(shí)現(xiàn)dragEnterEvent()和dropEvent()事件處理程序函數(shù)。 例如,以下代碼啟用了QWidget子類(lèi)的構(gòu)造函數(shù)中的Drop事件,從而可以有效地實(shí)現(xiàn)Drop事件處理程序: ??dragEnterEvent()通常用于通知qt小部件接受的數(shù)據(jù)類(lèi)型。如果要在DragMoveEvent()和dropEvent()的重新實(shí)現(xiàn)中接收QDragMoveEvent或QDropEvent,則必須重新實(shí)現(xiàn)此函數(shù)。 報(bào)錯(cuò) ??下面的代碼顯示如何重新實(shí)現(xiàn)DragEnterEvent(),以告訴拖放系統(tǒng)我們只能處理純文本: ??
??dropEvent()用于解包丟棄的數(shù)據(jù),并以適合您的應(yīng)用程序的方式對(duì)其進(jìn)行處理。 ??在以下代碼中,事件中提供的文本將傳遞給QTextBrowser,QComboBox將填充用于描述數(shù)據(jù)的mime類(lèi)型列表: ??
??在這種情況下,我們接受建議的操作,而不檢查它是什么。在實(shí)際應(yīng)用程序中,可能需要從dropEvent()函數(shù)返回,而不接受建議的操作,或者在操作不相關(guān)的情況下處理數(shù)據(jù)。例如,如果我們不支持到應(yīng)用程序中外部源的鏈接,我們可以選擇忽略Qt::LinkAction操作。
??也可以忽略提議的操作,并對(duì)數(shù)據(jù)執(zhí)行其他操作。為此,我們將在調(diào)用accept()之前使用Qt::dropAction中的首選操作調(diào)用事件對(duì)象的setDropAction()。這樣可以確保使用替換刪除操作而不是建議的操作。 對(duì)于更復(fù)雜的應(yīng)用程序,重新實(shí)現(xiàn)dragMoveEvent()和dragLeaveEvent()將使小部件的某些部分對(duì)放置事件敏感,并使您能夠更好地控制應(yīng)用程序中的拖放。
??某些標(biāo)準(zhǔn)Qt小部件為拖放提供了自己的支持。在對(duì)這些小部件進(jìn)行子類(lèi)化時(shí),除了DragCenterEvent()和DropEvent()之外,可能還需要重新實(shí)現(xiàn)DragMoveEvent(),以防止基類(lèi)提供默認(rèn)的拖放處理,并處理您感興趣的任何特殊情況。
<br>
??在最簡(jiǎn)單的情況下,拖放操作的目標(biāo)將接收正在拖動(dòng)的數(shù)據(jù)的副本,源將決定是否刪除原始數(shù)據(jù)。這由CopyAction操作描述。目標(biāo)還可以選擇處理其他操作,特別是MoveAction和LinkAction操作。如果源調(diào)用QDrag::exec(),并返回MoveAction,則如果源選擇刪除任何原始數(shù)據(jù),則該源將負(fù)責(zé)刪除。不應(yīng)刪除源小部件創(chuàng)建的QMimeData和QDrag對(duì)象-它們將被Qt銷(xiāo)毀。 目標(biāo)負(fù)責(zé)獲取在拖放操作中發(fā)送的數(shù)據(jù)的所有權(quán);這通常通過(guò)保留對(duì)數(shù)據(jù)的引用來(lái)實(shí)現(xiàn)。 ??如果目標(biāo)理解LinkAction操作,它應(yīng)該存儲(chǔ)自己對(duì)原始信息的引用;源不需要對(duì)數(shù)據(jù)執(zhí)行任何進(jìn)一步的處理。拖放操作的最常見(jiàn)用法是在同一個(gè)小部件中執(zhí)行移動(dòng);有關(guān)此功能的詳細(xì)信息,請(qǐng)參閱有關(guān)拖放操作的部分。 ??拖動(dòng)操作的另一個(gè)主要用途是在使用引用類(lèi)型(如text/uri-list)時(shí),其中拖動(dòng)的數(shù)據(jù)實(shí)際上是對(duì)文件或?qū)ο蟮囊谩?/p>
<br>
??拖放不限于文本和圖像。任何類(lèi)型的信息都可以在拖放操作中傳輸。要在應(yīng)用程序之間拖動(dòng)信息, 應(yīng)用程序必須能夠相互指示可以接受哪些數(shù)據(jù)格式以及可以生成哪些數(shù)據(jù)格式,這是通過(guò)使用mime類(lèi)型實(shí)現(xiàn)的。 由源構(gòu)造的QDrag對(duì)象包含一個(gè)用于表示數(shù)據(jù)的mime類(lèi)型列表(從最合適的到最不合適的順序排列),drop目標(biāo)使用其中一個(gè)來(lái)訪問(wèn)數(shù)據(jù)。對(duì)于常見(jiàn)的數(shù)據(jù)類(lèi)型,便利函數(shù)處理透明使用的mime類(lèi)型,但是對(duì)于自定義數(shù)據(jù)類(lèi)型,必須顯式地聲明它們。 ??要對(duì)QDrag便利功能未涵蓋的信息類(lèi)型執(zhí)行拖放操作,第一步也是最重要的一步是查找適當(dāng)?shù)默F(xiàn)有格式:Internet分配號(hào)碼管理局(IANA)在信息科學(xué)研究所(ISI)提供了MIME媒體類(lèi)型的分層列表。使用標(biāo)準(zhǔn)的mime類(lèi)型可以最大限度地提高應(yīng)用程序與其他軟件現(xiàn)在和將來(lái)的互操作性。 要支持其他媒體類(lèi)型,只需使用setData()函數(shù)設(shè)置QMimeData對(duì)象中的數(shù)據(jù),提供完整的mime類(lèi)型和以適當(dāng)格式包含數(shù)據(jù)的QByteArray。以下代碼從標(biāo)簽中獲取QPixmap,并將其存儲(chǔ)為QMimeData對(duì)象中的可移植網(wǎng)絡(luò)圖形(PNG)文件: ??
??對(duì)于這種情況,我們可以簡(jiǎn)單地使用setImageData()來(lái)提供各種格式的圖像數(shù)據(jù): ??
??在這種情況下,QByteArray方法仍然很有用,因?yàn)樗梢愿玫乜刂芉MimeData對(duì)象中存儲(chǔ)的數(shù)據(jù)量。 請(qǐng)注意,在項(xiàng)視圖中使用的自定義數(shù)據(jù)類(lèi)型必須聲明為元對(duì)象,并且必須實(shí)現(xiàn)它們的流運(yùn)算符。
<br>
??在剪貼板模型中,用戶(hù)可以剪切或復(fù)制源信息,然后粘貼它。同樣,在拖放模型中,用戶(hù)可以拖動(dòng)信息的副本,也可以將信息本身拖動(dòng)到新位置(移動(dòng)信息)。拖放模型對(duì)于程序員來(lái)說(shuō)還有一個(gè)額外的復(fù)雜之處:在操作完成之前,程序不知道用戶(hù)是否想要剪切或復(fù)制信息。在應(yīng)用程序之間拖動(dòng)信息時(shí),這通常沒(méi)有什么區(qū)別,但在應(yīng)用程序中,檢查使用了哪個(gè)放置操作是很重要的。 ??可以為一個(gè)小部件重新實(shí)現(xiàn)mouseMoveEvent(),并通過(guò)可能的拖放操作組合啟動(dòng)拖放操作。例如,可能希望確保拖動(dòng)始終移動(dòng)小部件中的對(duì)象: ??
??如果信息被放到另一個(gè)應(yīng)用程序中,exec()函數(shù)返回的操作可能默認(rèn)為copyAction,但是如果信息被放到同一個(gè)應(yīng)用程序中的另一個(gè)小部件中,我們可能會(huì)獲得不同的drop操作。 可以在小部件的dragMoveEvent()函數(shù)中篩選建議的放置操作。但是,可以接受DragEnterEvent()中所有建議的操作,并讓用戶(hù)稍后決定要接受哪個(gè)操作: ??
??當(dāng)小部件中發(fā)生放置時(shí),將調(diào)用DropEvent()處理程序函數(shù),我們可以依次處理每個(gè)可能的操作。首先,我們?cè)谕粋€(gè)小部件中處理拖放操作: ??
??在這種情況下,拒絕處理移動(dòng)操作。接受的每種類(lèi)型的跌落動(dòng)作都會(huì)進(jìn)行相應(yīng)的檢查和處理: ??
??注意,在上面的代碼中檢查了單獨(dú)的放置操作。如上所述,在覆蓋建議的操作部分,有時(shí)需要覆蓋建議的刪除操作,并從可能的刪除操作中選擇不同的操作。為此,需要檢查事件的possibleActions()提供的值中是否存在每個(gè)操作,使用setDropAction()設(shè)置Drop操作,并調(diào)用accept()。
<br>
??小部件的dragMoveEvent()可用于通過(guò)僅在光標(biāo)位于這些區(qū)域內(nèi)時(shí)接受建議的放置操作來(lái)限制小部件的某些部分的放置。例如,當(dāng)光標(biāo)位于子小部件(DropFrame)上時(shí),以下代碼接受任何建議的放置操作: ??
??如果您需要在拖放操作期間提供視覺(jué)反饋、滾動(dòng)窗口或任何適當(dāng)?shù)牟僮?,也可以使用DragMoveEvent()。
<br>
??應(yīng)用程序還可以通過(guò)將數(shù)據(jù)放在剪貼板上進(jìn)行通信。要訪問(wèn)這個(gè),您需要從QApplication對(duì)象獲取一個(gè)QClipboard對(duì)象。 ??QMimedata類(lèi)用于表示在剪貼板中傳輸?shù)臄?shù)據(jù)。要將數(shù)據(jù)放在剪貼板上,可以使用setText()、setImage()和setPixmap()方便函數(shù)來(lái)處理常見(jiàn)的數(shù)據(jù)類(lèi)型。這些函數(shù)與在QMimedata類(lèi)中找到的函數(shù)類(lèi)似,只是它們還帶有一個(gè)控制數(shù)據(jù)存儲(chǔ)位置的附加參數(shù):如果指定了剪貼板,則數(shù)據(jù)將放置在剪貼板上;如果指定了選擇,則數(shù)據(jù)將放置在鼠標(biāo)選擇中(僅在x11上)。默認(rèn)情況下,數(shù)據(jù)放在剪貼板上。 例如,我們可以使用以下代碼將QLineEdit的內(nèi)容復(fù)制到剪貼板:
??具有不同mime類(lèi)型的數(shù)據(jù)也可以放在剪貼板上。構(gòu)造一個(gè)qmimedata對(duì)象,并使用setData()函數(shù)按照前面部分描述的方式設(shè)置數(shù)據(jù);然后可以使用setmimedata()函數(shù)將該對(duì)象放到剪貼板上。 QClipboard類(lèi)可以通過(guò)其dataChanged()信號(hào)通知應(yīng)用程序它所包含的數(shù)據(jù)的更改。例如,我們可以通過(guò)將此信號(hào)連接到小部件中的插槽來(lái)監(jiān)視剪貼板: ??
??連接到此信號(hào)的插槽可以使用可用于表示該信號(hào)的MIME類(lèi)型之一讀取剪貼板上的數(shù)據(jù): ?? ??selectionChanged()信號(hào)可用于x11以監(jiān)視鼠標(biāo)選擇。
??在x11上,使用公共XDND協(xié)議,而在Windows Qt上使用OLE標(biāo)準(zhǔn),而Qt for MacOS使用Cocoa拖動(dòng)管理器。在x11, XDND使用MIME,因此不需要翻譯。無(wú)論平臺(tái)如何,QT API都是相同的。在Windows上,支持MIME的應(yīng)用程序可以使用MIME類(lèi)型的剪貼板格式名稱(chēng)進(jìn)行通信。一些Windows應(yīng)用程序已經(jīng)為其剪貼板格式使用了MIME命名約定。 ??用于轉(zhuǎn)換專(zhuān)用剪貼板格式的自定義類(lèi)可以通過(guò)在Windows上重新實(shí)現(xiàn)QwinMime或在MacOS上重新實(shí)現(xiàn)QMacPasteboardMime來(lái)注冊(cè)。
到此,相信大家對(duì)“Qt拽拖框架有哪些”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。