QGraphicsView 中實現拖拽

2021-06-14 00:07:51 字數 3634 閱讀 6875

開始想使用qgraphicsview結合qgraphicsscene和qgraphicsitem,做個繪製各種圖形的編輯器,想使用拖拽實現快捷方式,沒想到還有點波折。

已在qgraphicsvews中設定了setacceptdrops(true);

在執行時發現:當把拖拽的圖示放到qgraphicsvews上時,顯示的還是不可拖拽的形狀,但dragenterevent可以觸發。但後面的dropevent就不能觸發了。

上網一查,檢視接收到拖拽事件後會轉交給關聯的場景處理,但是在場景中重寫dropevent還是沒有撲捉到事件。

今天實際跟蹤了一下:

1、拖拽首先進入qgraphicsview觸發其dragenterevent事件:

[cpp]view plain

copy

print?

void qgraphicsview::dragenterevent(qdragenterevent *event)  

#else

q_unused(event)  

#endif

}  

void qgraphicsview::dragenterevent(qdragenterevent *event)

#else

q_unused(event)

#endif

}

上述函式主要是檢視有沒有場景,然後將事件轉交給場景處理,當然是在條件允許的情況下轉交給場景處理。

2、場景的dragenterevent

[cpp]view plain

copy

print?

void qgraphicsscene::dragenterevent(qgraphicsscenedragdropevent *event)    

void qgraphicsscene::dragenterevent(qgraphicsscenedragdropevent *event)

場景的dragenterevent其實很簡單就是接收拖拽事件

3、場景的dragmoveevent事件,重點就在於此

[cpp]view plain

copy

print?

"color: #333333">void qgraphicsscene::dragmoveevent(qgraphicsscenedragdropevent *event)  

bool eventdelivered = false;  

// find the topmost enabled items under the cursor. they are all

// candidates for accepting drag & drop events.

foreach (qgraphicsitem *item, d->itemsatposition(event->screenpos(),  

event->scenepos(),  

event->widget()))   

d->lastdropaction = event->dropaction();  

if (d->dragdropitem)   

// we've got a new drag & drop item

d->dragdropitem = item;  

}  // send the move event.

event->setdropaction(d->lastdropaction);  

event->accept();  

d->senddragdropevent(item, event);  

if (event->isaccepted())  

d->lastdropaction = event->dropaction();  

eventdelivered = true;  

break;  

}  if (!eventdelivered)   

// propagate

event->setdropaction(qt::ignoreaction);  

}  }  

void qgraphicsscene::dragmoveevent(qgraphicsscenedragdropevent *event)

bool eventdelivered = false;

// find the topmost enabled items under the cursor. they are all

// candidates for accepting drag & drop events.

foreach (qgraphicsitem *item, d->itemsatposition(event->screenpos(),

event->scenepos(),

event->widget()))

d->lastdropaction = event->dropaction();

if (d->dragdropitem)

// we've got a new drag & drop item

d->dragdropitem = item;

}// send the move event.

event->setdropaction(d->lastdropaction);

event->accept();

d->senddragdropevent(item, event);

if (event->isaccepted())

d->lastdropaction = event->dropaction();

eventdelivered = true;

break;

}if (!eventdelivered)

// propagate

event->setdropaction(qt::ignoreaction);

}}

很顯然,在拖拽移動過程中忽略了該事件,主要響應的是場景內可能存在的item拖拽事件

看到這,問題就有答案了,subclass場景類,重寫dragmoveevent

[cpp]view plain

copy

print?

void qgraphicsscene::dragmoveevent(qgraphicsscenedragdropevent *event)    

void qgraphicsscene::dragmoveevent(qgraphicsscenedragdropevent *event)

最後重寫dropevent,做最後拖拽處理就是了。

[cpp]view plain

copy

print?

class=cpp style="margin: 4px 0px; background-color: rgb(240,240,240)" name="code">

QGraphicsView 中實現拖拽

開始想使用qgraphicsview結合qgraphicsscene和qgraphicsitem,做個繪製各種圖形的編輯器,想使用拖拽實現快捷方式,沒想到還有點波折。已在qgraphicsvews中設定了setacceptdrops true 在執行時發現 當把拖拽的圖示放到qgraphicsvew...

QGraphicsView 擴充套件

過程 1.建立qgraphicsview的子類qthimageview,來實現上述功能 2.介面中新增qgraphicsview控制項,右鍵選擇 提公升為 將其提公升為qthimageview。滑鼠移動事件 滑鼠移動事件在預設情況下,在滑鼠按下的同事拖拽滑鼠時被觸發。qwidget的mousetra...

QGraphicsView相關整理

1 繼承qgraphicsview,改寫下面的protected成員函式進行自定義操作 protected void keypressevent qkeyevent event void mousepressevent qmouseevent event void paintevent qpaint...