QML防止滑鼠事件被過濾(竊取)

2021-10-07 11:18:39 字數 1473 閱讀 7771

如果將 mousearea 放置在篩選 child 滑鼠事件的 item(例如 flickable、swipeview )中,則當父 item 識別出手勢(例如滑動)時,滑鼠事件可能會從 mousearea 中被過濾。如果將 preventstealing 屬性設定為 true,則任何 item 都不會竊取該 mousearea 的滑鼠事件。(注意,一旦某 item 開始竊取事件,將 preventstealing 設定為 true 後,直到下一次相關事件才生效)

這個屬性是 mousearea 的,那麼對於我們自定義的 c++ qquickitem 該如何處理呢?通過 qt 原始碼,可以看到是呼叫 qquickitem 的 setkeepmousegrab 函式進行設定(配合 setacceptedmousebuttons(qt::leftbutton) 啟用了滑鼠事件才有效)。

//mousearea

bool qquickmousearea::preventstealing() const

void qquickmousearea::setpreventstealing(bool prevent)

}

//flickable

bool qquickflickable::filtermouseevent(qquickitem *receiver, qmouseevent *event)

bool receiverdisabled = receiver && !receiver->isenabled();

bool stealthisevent = d->stealmouse;

bool receiverkeepsgrab = receiver && (receiver->keepmousegrab() || receiver->keeptouchgrab());

if ((stealthisevent || contains(localpos)) && (!receiver || !receiverkeepsgrab || receiverdisabled))

if ((receiver && stealthisevent && !receiverkeepsgrab && receiver != this) || receiverdisabled) else if (d->delayedpressevent)

const bool filtered = stealthisevent || d->delayedpressevent || receiverdisabled;

if (filtered)

return filtered;

} else if (d->lastpostime != -1)

if (event->type() == qevent::mousebuttonrelease || (receiverkeepsgrab && !receiverdisabled))

return false;

}

參考 qt 文件:

QML 事件處理 滑鼠 鍵盤 定時器

mousearea 物件可以附加到乙個 item 上供 item 處理滑鼠事件,它本身是乙個不可見的 item 在其內部,可以直接引用它所附著的物件的屬性和方法。你可以將 mousearea 理解為它所附著的 item 的 mousearea 有很多屬性,enabled 用來控制是否處理滑鼠事件,預...

qml滑鼠拖動 qml實現視窗拖動

在去掉視窗標題欄後視窗會失去滑鼠拖動效果,所以需要自己新增拖動效果。實現 id mainwindow visible true width 900 height 600 title qstr hello world flags qt.window qt.framelesswindowhint 去標題...

滑鼠事件 跟隨滑鼠移動

案例分析 1.滑鼠不斷移動,使用滑鼠移動事件 mousemove 2.在頁面中不斷移動,給document註冊事件 3.要移動距離,而且不佔位置,我們使用絕對定位 效果 跟隨滑鼠的天使 title 6 style 7img 11style 12head 13 body 14 img src pic....