diff --git a/QtScrcpy/uibase/magneticwidget.cpp b/QtScrcpy/uibase/magneticwidget.cpp index 3c7a9c2..70e0620 100644 --- a/QtScrcpy/uibase/magneticwidget.cpp +++ b/QtScrcpy/uibase/magneticwidget.cpp @@ -9,6 +9,7 @@ MagneticWidget::MagneticWidget(QWidget *adsorbWidget, AdsorbPositions adsorbPos) Q_ASSERT(m_adsorbWidget); setParent(m_adsorbWidget); setWindowFlags(windowFlags() | Qt::Tool); + m_adsorbWidgetSize = m_adsorbWidget->size(); m_adsorbWidget->installEventFilter(this); } @@ -30,6 +31,10 @@ bool MagneticWidget::eventFilter(QObject *watched, QEvent *event) if (watched != m_adsorbWidget || !event) { return false; } + // 始终记录adsorbWidget最新size + if (QEvent::Resize == event->type()) { + m_adsorbWidgetSize = m_adsorbWidget->size(); + } if (m_adsorbed && QEvent::Move == event->type()) { move(m_adsorbWidget->pos() - m_relativePos); } @@ -48,7 +53,7 @@ bool MagneticWidget::eventFilter(QObject *watched, QEvent *event) pos.setY(pos.y() - m_relativePos.y()); break; case AP_OUTSIDE_RIGHT: - pos.setX(pos.x() + m_adsorbWidget->width()); + pos.setX(pos.x() + m_adsorbWidgetSize.width()); pos.setY(pos.y() - m_relativePos.y()); break; case AP_OUTSIDE_TOP: @@ -165,8 +170,8 @@ void MagneticWidget::moveEvent(QMoveEvent *event) void MagneticWidget::getGeometry(QRect &relativeWidgetRect, QRect &targetWidgetRect) { relativeWidgetRect.setTopLeft(m_adsorbWidget->pos()); - relativeWidgetRect.setWidth(m_adsorbWidget->width()); - relativeWidgetRect.setHeight(m_adsorbWidget->height()); + relativeWidgetRect.setWidth(m_adsorbWidgetSize.width()); + relativeWidgetRect.setHeight(m_adsorbWidgetSize.height()); targetWidgetRect.setTopLeft(pos()); targetWidgetRect.setWidth(width()); diff --git a/QtScrcpy/uibase/magneticwidget.h b/QtScrcpy/uibase/magneticwidget.h index 23b6cff..843c835 100644 --- a/QtScrcpy/uibase/magneticwidget.h +++ b/QtScrcpy/uibase/magneticwidget.h @@ -46,6 +46,9 @@ private: QPoint m_relativePos; bool m_adsorbed = false; QPointer m_adsorbWidget; + // 单独记录adsorbWidgetSize,因为Widget setGeometry的时候,会先收到Move事件,后收到Resize事件, + // 但是收到Move事件时Widget的size()已经是setGeometry指定的size了 + QSize m_adsorbWidgetSize; AdsorbPosition m_curAdsorbPosition; };