qt禁止拖動 Qt如何實現拖拽功能?

2021-10-13 02:18:47 字數 870 閱讀 6475

如上圖所示,如何實現通過拖拽的方式交換兩個按鈕的文字?

嚴格的說應該叫拖放方式,它包含了拖動和放置兩個部分。拖動通過drag實現,放下通過dropevent事件實現。該例子有點特殊就是拖動和放下的物件都是按鈕,所以拖動和放下都是在同乙個類中實現。具體實現步驟如下:

從qpushbutton類派生乙個類,用以重寫事件。

需要重寫的事件有mousemoveevent,在該事件中實現拖動的操作,dropevent事件中實現放下的操作。而dragenterevent事件在dropevent之前執行,為了讓拖拽事件往下傳遞,所以也需要重寫該事件。

2.讓按鈕接收放下事件

必須呼叫setacceptdrops為true,否則不會呼叫dragenterevent和dropevent。

3.建立qdrag物件

在滑鼠移動的事件中建立qdrag物件,這樣更符合操作的習慣。建立qdrag物件後要為它設定乙個qmimedata,這裡設定乙個文字型別的資料,內容為當前按鈕的文字。最後呼叫qdrag的exec函式,這樣拖動部分的功能就實現了。

4.實現放下功能

在dropevent事件中獲取拖拽事件的資料,event->mimedata()返回的就是qmimedata。呼叫this->settext(event->mimedata()->text())實現了將當前按鈕的文字設定為拖拽源物件的文字。

event->source()可以獲取事件的源物件,在此例中源和目標物件都是dragbutton。

5.重寫dragenterevent

為了讓事件傳遞,呼叫event->accept()。自此dragbutton就完成了。

6.最後在介面中建立幾個dragbutton物件測試一下即可。

測試環境:windows 10    qt5.9

Qt 中 實現窗體拖動

實現窗體拖動 如果我們不使用作業系統自帶的標題欄,首先就應該將windows標題欄去掉,這個功能只要一條語句就能夠實現,那就是在建構函式中加入 setwindowsflags qt framelesshint 但是窗體就固定不動了,既不能拖動也不能拉伸,下面我就介紹一種方法來實現窗體的拖動。1.在類...

QT實現視窗可拖動

qt實現視窗可拖動需要在視窗類中重寫以下三個函式 virtual void mousepressevent qmouseevent event virtual void mousemoveevent qmouseevent event virtual void mousereleaseevent q...

QT完整實現拖拽示例

1.資料層 實現拖拽先要子類化qstandarditemmodel 2.檢視層 新增tree控制項 3.渲染層 初始化data setdata 設定拖拽型別 seticon設定圖示 4.業務層 實現拖拽邏輯 dragenterevent 中過濾拖拽物件 const qmimedata data ev...