From 5a00e46e1a70760a70a5f5c764503518db43d1ae Mon Sep 17 00:00:00 2001 From: YinJie Date: Wed, 5 Jan 2022 15:52:40 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=E4=B8=8D=E6=98=BE=E7=A4=BA=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 现象:在ZHAOXIN设备上出现点击音量、网络插件大概率不出现弹窗。 原因:DRegionMonitor::buttonRelease和Qt的MouseRelease事件顺序不可控,会导致在显示了弹窗之后又把它隐藏了。 处理方案:在显示弹窗后添加一个10ms的延时,不处理buttonRelease事件。 Log: Bug: https://pms.uniontech.com/zentao/bug-view-109423.html Influence: 鼠标左键点击托盘插件的场景,观察弹窗的显示和隐藏。 Change-Id: I7266d64699da51f2f453bbce5b2b71be555132fd --- frame/util/dockpopupwindow.cpp | 17 ++++++++++++++++- frame/util/dockpopupwindow.h | 2 ++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/frame/util/dockpopupwindow.cpp b/frame/util/dockpopupwindow.cpp index 36d187b02..5675eba52 100644 --- a/frame/util/dockpopupwindow.cpp +++ b/frame/util/dockpopupwindow.cpp @@ -36,7 +36,8 @@ DWIDGET_USE_NAMESPACE DockPopupWindow::DockPopupWindow(QWidget *parent) : DArrowRectangle(ArrowBottom, parent), m_model(false), - m_regionInter(new DRegionMonitor(this)) + m_regionInter(new DRegionMonitor(this)), + m_enableMouseRelease(true) { setMargin(0); m_wmHelper = DWindowManagerHelper::instance(); @@ -94,15 +95,26 @@ void DockPopupWindow::show(const QPoint &pos, const bool model) if (m_model) { m_regionInter->registerRegion(); } + blockButtonRelease(); } void DockPopupWindow::show(const int x, const int y) { m_lastPoint = QPoint(x, y); + blockButtonRelease(); DArrowRectangle::show(x, y); } +void DockPopupWindow::blockButtonRelease() +{ + // 短暂的不处理鼠标release事件,防止出现刚显示又被隐藏的情况 + m_enableMouseRelease = false; + QTimer::singleShot(10, this, [this] { + m_enableMouseRelease = true; + }); +} + void DockPopupWindow::hide() { if (m_regionInter->registered()) @@ -153,6 +165,9 @@ void DockPopupWindow::onGlobMouseRelease(const QPoint &mousePos, const int flag) { Q_ASSERT(m_model); + if (!m_enableMouseRelease) + return; + if (!((flag == DRegionMonitor::WatchedFlags::Button_Left) || (flag == DRegionMonitor::WatchedFlags::Button_Right))) { return; diff --git a/frame/util/dockpopupwindow.h b/frame/util/dockpopupwindow.h index 81465abea..ca63f505e 100644 --- a/frame/util/dockpopupwindow.h +++ b/frame/util/dockpopupwindow.h @@ -58,6 +58,7 @@ protected: void showEvent(QShowEvent *e); void enterEvent(QEvent *e); bool eventFilter(QObject *o, QEvent *e); + void blockButtonRelease(); private slots: void onGlobMouseRelease(const QPoint &mousePos, const int flag); @@ -70,6 +71,7 @@ private: DRegionMonitor *m_regionInter; DWindowManagerHelper *m_wmHelper; + bool m_enableMouseRelease; }; #endif // DOCKPOPUPWINDOW_H