qmsetup @ f17220 | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/core/contexts/abstractwindowcontext.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/core/contexts/abstractwindowcontext_p.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/quick/quickwindowagent.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/quick/quickwindowagent.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/widgets/widgetwindowagent.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/widgets/widgetwindowagent.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
qmsetup
@@ -1 +1 @@ Subproject commit ba85e3a940c1698987ce0faecb5af9bdca83c599 Subproject commit f17220c8b491d85942329abacfc3ed7abf440535 src/core/contexts/abstractwindowcontext.cpp
@@ -26,16 +26,27 @@ notifyWinIdChange(); } bool AbstractWindowContext::setHitTestVisible(const QObject *obj, bool visible) { bool AbstractWindowContext::setHitTestVisible(QObject *obj, bool visible) { Q_ASSERT(obj); if (!obj) { return false; } auto it = m_hitTestVisibleItems.find(obj); if (visible) { if (it != m_hitTestVisibleItems.end()) { return true; } connect(obj, &QObject::destroyed, this, &AbstractWindowContext::_q_hitTestVisibleItemDestroyed); m_hitTestVisibleItems.insert(obj); } else { m_hitTestVisibleItems.remove(obj); if (it == m_hitTestVisibleItems.end()) { return false; } disconnect(obj, &QObject::destroyed, this, &AbstractWindowContext::_q_hitTestVisibleItemDestroyed); m_hitTestVisibleItems.erase(it); } return true; } @@ -47,8 +58,18 @@ return false; } if (m_systemButtons[button] == obj) { return false; auto org = m_systemButtons[button]; if (org == obj) { return true; } if (org) { disconnect(org, &QObject::destroyed, this, &AbstractWindowContext::_q_systemButtonDestroyed); } if (obj) { connect(obj, &QObject::destroyed, this, &AbstractWindowContext::_q_systemButtonDestroyed); } m_systemButtons[button] = obj; return true; @@ -56,18 +77,20 @@ bool AbstractWindowContext::setTitleBar(QObject *item) { Q_ASSERT(item); if (m_titleBar == item) { auto org = m_titleBar; if (org == item) { return false; } if (m_titleBar) { if (org) { // Since the title bar is changed, all items inside it should be dereferenced right away for (auto &button : m_systemButtons) { button = nullptr; } m_hitTestVisibleItems.clear(); removeSystemButtonsAndHitTestItems(); disconnect(org, &QObject::destroyed, this, &AbstractWindowContext::_q_titleBarDistroyed); } if (item) { connect(item, &QObject::destroyed, this, &AbstractWindowContext::_q_titleBarDistroyed); } m_titleBar = item; return true; } @@ -278,4 +301,38 @@ return false; } void AbstractWindowContext::removeSystemButtonsAndHitTestItems() { for (auto &button : m_systemButtons) { if (!button) { continue; } disconnect(button, &QObject::destroyed, this, &AbstractWindowContext::_q_systemButtonDestroyed); button = nullptr; } for (auto &item : m_hitTestVisibleItems) { disconnect(item, &QObject::destroyed, this, &AbstractWindowContext::_q_hitTestVisibleItemDestroyed); } m_hitTestVisibleItems.clear(); } void AbstractWindowContext::_q_titleBarDistroyed(QObject *obj) { Q_UNUSED(obj) removeSystemButtonsAndHitTestItems(); m_titleBar = nullptr; } void AbstractWindowContext::_q_hitTestVisibleItemDestroyed(QObject *obj) { m_hitTestVisibleItems.remove(obj); } void AbstractWindowContext::_q_systemButtonDestroyed(QObject *obj) { for (auto &item : m_systemButtons) { if (item == obj) { item = nullptr; } } } } src/core/contexts/abstractwindowcontext_p.h
@@ -47,7 +47,7 @@ inline WindowItemDelegate *delegate() const; inline bool isHitTestVisible(const QObject *obj) const; bool setHitTestVisible(const QObject *obj, bool visible); bool setHitTestVisible(QObject *obj, bool visible); inline QObject *systemButton(WindowAgentBase::SystemButton button) const; bool setSystemButton(WindowAgentBase::SystemButton button, QObject *obj); @@ -124,6 +124,13 @@ QVariantHash m_windowAttributes; std::unique_ptr<WinIdChangeEventFilter> m_winIdChangeEventFilter; void removeSystemButtonsAndHitTestItems(); private: void _q_titleBarDistroyed(QObject *obj); void _q_hitTestVisibleItemDestroyed(QObject *obj); void _q_systemButtonDestroyed(QObject *obj); }; inline QObject *AbstractWindowContext::host() const { src/quick/quickwindowagent.cpp
@@ -90,11 +90,8 @@ Q_D(const QuickWindowAgent); return d->context->isHitTestVisible(item); } #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) void QuickWindowAgent::setHitTestVisible(QQuickItem *item, bool visible) { #else void QuickWindowAgent::setHitTestVisible(const QQuickItem *item, bool visible) { #endif Q_D(QuickWindowAgent); d->context->setHitTestVisible(item, visible); } src/quick/quickwindowagent.h
@@ -33,11 +33,10 @@ #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) Q_INVOKABLE bool isHitTestVisible(QQuickItem *item) const; Q_INVOKABLE void setHitTestVisible(QQuickItem *item, bool visible = true); #else Q_INVOKABLE bool isHitTestVisible(const QQuickItem *item) const; Q_INVOKABLE void setHitTestVisible(const QQuickItem *item, bool visible = true); #endif Q_INVOKABLE void setHitTestVisible(QQuickItem *item, bool visible = true); #ifdef Q_OS_MAC // The system button area APIs are experimental, very likely to change in the future. src/widgets/widgetwindowagent.cpp
@@ -123,7 +123,7 @@ You're supposed to make sure that the specified widget \a w is a child or descendant of the title bar widget. */ void WidgetWindowAgent::setHitTestVisible(const QWidget *w, bool visible) { void WidgetWindowAgent::setHitTestVisible(QWidget *w, bool visible) { Q_D(WidgetWindowAgent); d->context->setHitTestVisible(w, visible); } src/widgets/widgetwindowagent.h
@@ -40,7 +40,7 @@ #endif bool isHitTestVisible(const QWidget *w) const; void setHitTestVisible(const QWidget *w, bool visible = true); void setHitTestVisible(QWidget *w, bool visible = true); Q_SIGNALS: void titleBarChanged(QWidget *w);