diff --git a/frame/window/tray/widgets/basetraywidget.h b/frame/window/tray/widgets/basetraywidget.h index b68064959..56ffe85a6 100644 --- a/frame/window/tray/widgets/basetraywidget.h +++ b/frame/window/tray/widgets/basetraywidget.h @@ -32,6 +32,7 @@ public: virtual bool needShow(); virtual void setNeedShow(bool needShow); virtual QPixmap icon() = 0; + virtual bool containsPoint(const QPoint& mouse) = 0; Q_SIGNALS: void iconChanged(); diff --git a/frame/window/tray/widgets/expandiconwidget.cpp b/frame/window/tray/widgets/expandiconwidget.cpp index f9cccacc7..5424d8219 100644 --- a/frame/window/tray/widgets/expandiconwidget.cpp +++ b/frame/window/tray/widgets/expandiconwidget.cpp @@ -132,7 +132,7 @@ TrayGridWidget *ExpandIconWidget::popupTrayView() TrayModel *trayModel = TrayModel::getIconModel(); gridParentView->setTrayGridView(trayView); - gridParentView->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool); + gridParentView->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowStaysOnTopHint); trayView->setModel(trayModel); trayView->setItemDelegate(trayDelegate); trayView->setSpacing(ITEM_SPACING); @@ -294,7 +294,7 @@ void TrayGridWidget::initMember() QAbstractItemModel *dataModel = m_trayGridView->model(); for (int i = 0; i < dataModel->rowCount(); i++) { QModelIndex index = dataModel->index(i, 0); - SystemPluginItem *widget = qobject_cast(m_trayGridView->indexWidget(index)); + BaseTrayWidget *widget = qobject_cast(m_trayGridView->indexWidget(index)); if (widget && widget->containsPoint(mousePos)) return; } diff --git a/frame/window/tray/widgets/expandiconwidget.h b/frame/window/tray/widgets/expandiconwidget.h index 03e3e09b3..746f09a86 100644 --- a/frame/window/tray/widgets/expandiconwidget.h +++ b/frame/window/tray/widgets/expandiconwidget.h @@ -36,6 +36,7 @@ public: void updateIcon() override {} QPixmap icon() override; static TrayGridWidget *popupTrayView(); + bool containsPoint(const QPoint &mouse) override { return false; } protected: void paintEvent(QPaintEvent *event) override; diff --git a/frame/window/tray/widgets/indicatortrayitem.h b/frame/window/tray/widgets/indicatortrayitem.h index 1eba5610d..e7029fdfc 100644 --- a/frame/window/tray/widgets/indicatortrayitem.h +++ b/frame/window/tray/widgets/indicatortrayitem.h @@ -29,6 +29,7 @@ public: QPixmap icon() override; const QByteArray &pixmapData() const; const QString text() const; + bool containsPoint(const QPoint &mouse) override { return false; } public Q_SLOTS: Q_SCRIPTABLE void setPixmapData(const QByteArray &data); diff --git a/frame/window/tray/widgets/snitrayitemwidget.cpp b/frame/window/tray/widgets/snitrayitemwidget.cpp index 21468b9b9..07009f2a6 100644 --- a/frame/window/tray/widgets/snitrayitemwidget.cpp +++ b/frame/window/tray/widgets/snitrayitemwidget.cpp @@ -779,3 +779,15 @@ void SNITrayItemWidget::setMouseData(QMouseEvent *e) m_handleMouseReleaseTimer->start(); } + +bool SNITrayItemWidget::containsPoint(const QPoint &pos) { + QPoint ptGlobal = mapToGlobal(QPoint(0, 0)); + QRect rectGlobal(ptGlobal, this->size()); + if (rectGlobal.contains(pos)) return true; + + // 如果菜单列表隐藏,则认为不在区域内 + if (!m_menu->isVisible()) return false; + + // 判断鼠标是否在菜单区域 + return m_menu->geometry().contains(pos); +} diff --git a/frame/window/tray/widgets/snitrayitemwidget.h b/frame/window/tray/widgets/snitrayitemwidget.h index 6d4193c58..46f2619c0 100644 --- a/frame/window/tray/widgets/snitrayitemwidget.h +++ b/frame/window/tray/widgets/snitrayitemwidget.h @@ -59,6 +59,8 @@ public: static void setDockPostion(const Dock::Position pos) { DockPosition = pos; } + bool containsPoint(const QPoint& mouse) override; + QPixmap icon() override; Q_SIGNALS: diff --git a/frame/window/tray/widgets/systempluginitem.cpp b/frame/window/tray/widgets/systempluginitem.cpp index f09fe7794..06d55d414 100644 --- a/frame/window/tray/widgets/systempluginitem.cpp +++ b/frame/window/tray/widgets/systempluginitem.cpp @@ -369,7 +369,7 @@ void SystemPluginItem::hidePopup() emit requestWindowAutoHide(true); } -bool SystemPluginItem::containsPoint(QPoint pos) +bool SystemPluginItem::containsPoint(const QPoint& pos) { QPoint ptGlobal = mapToGlobal(QPoint(0, 0)); QRect rectGlobal(ptGlobal, this->size()); diff --git a/frame/window/tray/widgets/systempluginitem.h b/frame/window/tray/widgets/systempluginitem.h index c4177c211..d091c647b 100644 --- a/frame/window/tray/widgets/systempluginitem.h +++ b/frame/window/tray/widgets/systempluginitem.h @@ -46,7 +46,7 @@ public: void showPopupApplet(QWidget * const applet); void hidePopup(); - bool containsPoint(QPoint pos); + bool containsPoint(const QPoint& mouse) override; signals: void itemVisibleChanged(bool visible); diff --git a/frame/window/tray/widgets/xembedtrayitemwidget.h b/frame/window/tray/widgets/xembedtrayitemwidget.h index 788484741..d076c87fe 100644 --- a/frame/window/tray/widgets/xembedtrayitemwidget.h +++ b/frame/window/tray/widgets/xembedtrayitemwidget.h @@ -32,6 +32,7 @@ public: static bool isXEmbedKey(const QString &itemKey); virtual bool isValid() override {return m_valid;} QPixmap icon() override; + bool containsPoint(const QPoint &mouse) override { return false; } private: void showEvent(QShowEvent *e) override;