QWidget: don't set WA_PendingMoveEvent when geometry does not change
When the geometry of a hidden widget was set with setGeometry(), WA_PendingMoveEvent and WA_PendingResizeEvent were set unconditionally even if the crect already had the correct value. This lead to unneeded Move/Resize events within sendPendingMoveAndResizeEvents(). Fixes: QTBUG-75475 Fixes: QTBUG-79906 Change-Id: Ibbe03882f039948b6b7c04887420741ed2e9c0f7 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io> Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>bb10
parent
78cde1bfd9
commit
4422a9bd88
|
|
@ -7005,8 +7005,10 @@ void QWidget::resize(const QSize &s)
|
|||
d->setGeometry_sys(geometry().x(), geometry().y(), s.width(), s.height(), false);
|
||||
d->setDirtyOpaqueRegion();
|
||||
} else {
|
||||
const auto oldRect = data->crect;
|
||||
data->crect.setSize(s.boundedTo(maximumSize()).expandedTo(minimumSize()));
|
||||
setAttribute(Qt::WA_PendingResizeEvent);
|
||||
if (oldRect != data->crect)
|
||||
setAttribute(Qt::WA_PendingResizeEvent);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -7021,10 +7023,13 @@ void QWidget::setGeometry(const QRect &r)
|
|||
d->setGeometry_sys(r.x(), r.y(), r.width(), r.height(), true);
|
||||
d->setDirtyOpaqueRegion();
|
||||
} else {
|
||||
const auto oldRect = data->crect;
|
||||
data->crect.setTopLeft(r.topLeft());
|
||||
data->crect.setSize(r.size().boundedTo(maximumSize()).expandedTo(minimumSize()));
|
||||
setAttribute(Qt::WA_PendingMoveEvent);
|
||||
setAttribute(Qt::WA_PendingResizeEvent);
|
||||
if (oldRect != data->crect) {
|
||||
setAttribute(Qt::WA_PendingMoveEvent);
|
||||
setAttribute(Qt::WA_PendingResizeEvent);
|
||||
}
|
||||
}
|
||||
|
||||
if (d->extra && d->extra->hasWindowContainer)
|
||||
|
|
|
|||
|
|
@ -53,6 +53,7 @@
|
|||
#include <qmainwindow.h>
|
||||
#include <qdockwidget.h>
|
||||
#include <qrandom.h>
|
||||
#include <qstylehints.h>
|
||||
#include <qtoolbar.h>
|
||||
#include <qtoolbutton.h>
|
||||
#include <QtCore/qoperatingsystemversion.h>
|
||||
|
|
@ -198,6 +199,7 @@ private slots:
|
|||
void hideWhenFocusWidgetIsChild();
|
||||
void normalGeometry();
|
||||
void setGeometry();
|
||||
void setGeometryHidden();
|
||||
void windowOpacity();
|
||||
void raise();
|
||||
void lower();
|
||||
|
|
@ -2922,6 +2924,38 @@ void tst_QWidget::setGeometry()
|
|||
QCOMPARE(tlw.geometry(), tr);
|
||||
}
|
||||
|
||||
void tst_QWidget::setGeometryHidden()
|
||||
{
|
||||
if (QGuiApplication::styleHints()->showIsMaximized())
|
||||
QSKIP("Platform does not support QWidget::setGeometry() - skipping");
|
||||
|
||||
QWidget tlw;
|
||||
tlw.setWindowTitle(QLatin1String(QTest::currentTestFunction()));
|
||||
QWidget child(&tlw);
|
||||
|
||||
const QRect tr(m_availableTopLeft + QPoint(100, 100), 2 * m_testWidgetSize);
|
||||
const QRect cr(QPoint(50, 50), m_testWidgetSize);
|
||||
tlw.setGeometry(tr);
|
||||
child.setGeometry(cr);
|
||||
tlw.showNormal();
|
||||
|
||||
tlw.hide();
|
||||
QTRY_VERIFY(tlw.isHidden());
|
||||
tlw.setGeometry(cr);
|
||||
QVERIFY(tlw.testAttribute(Qt::WA_PendingMoveEvent));
|
||||
QVERIFY(tlw.testAttribute(Qt::WA_PendingResizeEvent));
|
||||
QImage img(tlw.size(), QImage::Format_ARGB32); // just needed to call QWidget::render()
|
||||
tlw.render(&img);
|
||||
QVERIFY(!tlw.testAttribute(Qt::WA_PendingMoveEvent));
|
||||
QVERIFY(!tlw.testAttribute(Qt::WA_PendingResizeEvent));
|
||||
tlw.setGeometry(cr);
|
||||
QVERIFY(!tlw.testAttribute(Qt::WA_PendingMoveEvent));
|
||||
QVERIFY(!tlw.testAttribute(Qt::WA_PendingResizeEvent));
|
||||
tlw.resize(cr.size());
|
||||
QVERIFY(!tlw.testAttribute(Qt::WA_PendingMoveEvent));
|
||||
QVERIFY(!tlw.testAttribute(Qt::WA_PendingResizeEvent));
|
||||
}
|
||||
|
||||
void tst_QWidget::windowOpacity()
|
||||
{
|
||||
QWidget widget;
|
||||
|
|
|
|||
Loading…
Reference in New Issue