開始想使用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...