QMenu size fix - Mark items dirty on screen change
It seems like an optimization on the itemsDirty flag caused a bug to be re-introduced. When a popup is shown on a new screen, the itemsDirty must however be set to ensure that new correct sizes are calculated. Task-number: QTBUG-59794 Change-Id: Ifb5c233b1f9d4d38bd0cd7a9a71cc32ad3212f8c Reviewed-by: Morten Kristensen <msk@nullpointer.dk> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> Reviewed-by: Christian Ehrlicher <ch.ehrlicher@gmx.de>
This commit is contained in:
parent
d661a22ae2
commit
48f7f65dc3
@ -2580,14 +2580,15 @@ void QWidgetPrivate::createWinId()
|
||||
/*!
|
||||
\internal
|
||||
Ensures that the widget is set on the screen point is on. This is handy getting a correct
|
||||
size hint before a resize in e.g QMenu and QToolTip
|
||||
size hint before a resize in e.g QMenu and QToolTip.
|
||||
Returns if the screen was changed.
|
||||
*/
|
||||
|
||||
void QWidgetPrivate::setScreenForPoint(const QPoint &pos)
|
||||
bool QWidgetPrivate::setScreenForPoint(const QPoint &pos)
|
||||
{
|
||||
Q_Q(QWidget);
|
||||
if (!q->isWindow())
|
||||
return;
|
||||
return false;
|
||||
// Find the screen for pos and make the widget undertand it is on that screen.
|
||||
const QScreen *currentScreen = windowHandle() ? windowHandle()->screen() : nullptr;
|
||||
QScreen *actualScreen = QGuiApplication::screenAt(pos);
|
||||
@ -2596,7 +2597,9 @@ void QWidgetPrivate::setScreenForPoint(const QPoint &pos)
|
||||
createWinId();
|
||||
if (windowHandle())
|
||||
windowHandle()->setScreen(actualScreen);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -355,7 +355,7 @@ public:
|
||||
void createRecursively();
|
||||
void createWinId();
|
||||
|
||||
void setScreenForPoint(const QPoint &pos);
|
||||
bool setScreenForPoint(const QPoint &pos);
|
||||
|
||||
void createTLExtra();
|
||||
void createExtra();
|
||||
|
@ -73,6 +73,7 @@
|
||||
#endif
|
||||
#include "qpushbutton.h"
|
||||
#include "qtooltip.h"
|
||||
#include <qwindow.h>
|
||||
#include <private/qpushbutton_p.h>
|
||||
#include <private/qaction_p.h>
|
||||
#include <private/qguiapplication_p.h>
|
||||
@ -2356,8 +2357,10 @@ void QMenu::popup(const QPoint &p, QAction *atAction)
|
||||
d->motions = 0;
|
||||
d->doChildEffects = true;
|
||||
d->updateLayoutDirection();
|
||||
// Ensure that we get correct sizeHints by placing this window on the right screen.
|
||||
d->setScreenForPoint(p);
|
||||
|
||||
// Ensure that we get correct sizeHints by placing this window on the correct screen.
|
||||
if (d->setScreenForPoint(p))
|
||||
d->itemsDirty = true;
|
||||
|
||||
const bool contextMenu = d->isContextMenu();
|
||||
if (d->lastContextMenu != contextMenu) {
|
||||
|
Loading…
Reference in New Issue
Block a user