fix: 修复点击图标不显示弹窗的问题

现象:在ZHAOXIN设备上出现点击音量、网络插件大概率不出现弹窗。
原因:DRegionMonitor::buttonRelease和Qt的MouseRelease事件顺序不可控,会导致在显示了弹窗之后又把它隐藏了。
处理方案:在显示弹窗后添加一个10ms的延时,不处理buttonRelease事件。

Log:
Bug: https://pms.uniontech.com/zentao/bug-view-109423.html
Influence: 鼠标左键点击托盘插件的场景,观察弹窗的显示和隐藏。
Change-Id: I7266d64699da51f2f453bbce5b2b71be555132fd
This commit is contained in:
YinJie 2022-01-05 15:52:40 +08:00
parent 2ee4b0c25d
commit 5a00e46e1a
2 changed files with 18 additions and 1 deletions

View File

@ -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;

View File

@ -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