summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMorten Johan Sørvig <morten.sorvig@qt.io>2020-08-21 16:20:31 +0200
committerMorten Johan Sørvig <morten.sorvig@qt.io>2020-08-30 01:56:05 +0200
commit707b64bece4b5639a6bf5f2f51bd00690b77bead (patch)
treec15b42674596582eabf29afac5acbeb3562d7537
parenta646bcf2be23a65c6ee0a0efdeb6e787c80ac457 (diff)
Display combobox popup on the correct screen
Display QCompoBox popups on the correct screen, also when the parent window spans multiple screens. In this case, QWidget::screen() will return the main screen for the window, which will not necessarily be the screen at the combobox popup position. Change-Id: Ib8a8163a757f7b849883b833fbde27a1e01af49a Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
-rw-r--r--src/widgets/kernel/qwidget_p.h42
-rw-r--r--src/widgets/widgets/qcombobox.cpp8
-rw-r--r--src/widgets/widgets/qcombobox_p.h2
3 files changed, 40 insertions, 12 deletions
diff --git a/src/widgets/kernel/qwidget_p.h b/src/widgets/kernel/qwidget_p.h
index d27a955c81..b63729cd87 100644
--- a/src/widgets/kernel/qwidget_p.h
+++ b/src/widgets/kernel/qwidget_p.h
@@ -51,6 +51,8 @@
// We mean it.
//
+
+
#include <QtWidgets/private/qtwidgetsglobal_p.h>
#include "QtWidgets/qwidget.h"
#include "private/qobject_p.h"
@@ -498,19 +500,45 @@ public:
#endif
return rect;
}
+
static QRect screenGeometry(const QWidget *widget)
{
- QRect rect = graphicsViewParentRect(widget);
- if (rect.isNull())
- rect = widget->screen()->geometry();
- return rect;
+ return screenGeometry(widget, QPoint(), false);
}
+
static QRect availableScreenGeometry(const QWidget *widget)
{
+ return availableScreenGeometry(widget, QPoint(), false);
+ }
+
+ static QRect screenGeometry(const QWidget *widget, const QPoint &globalPosition, bool hasPosition = true)
+ {
QRect rect = graphicsViewParentRect(widget);
- if (rect.isNull())
- rect = widget->screen()->availableGeometry();
- return rect;
+ if (!rect.isNull())
+ return rect;
+
+ QScreen *screen = nullptr;
+ if (hasPosition)
+ screen = widget->screen()->virtualSiblingAt(globalPosition);
+ if (!screen)
+ screen = widget->screen();
+
+ return screen->geometry();
+ }
+
+ static QRect availableScreenGeometry(const QWidget *widget, const QPoint &globalPosition, bool hasPosition = true)
+ {
+ QRect rect = graphicsViewParentRect(widget);
+ if (!rect.isNull())
+ return rect;
+
+ QScreen *screen = nullptr;
+ if (hasPosition)
+ screen = widget->screen()->virtualSiblingAt(globalPosition);
+ if (!screen)
+ screen = widget->screen();
+
+ return screen->availableGeometry();
}
inline void setRedirected(QPaintDevice *replacement, const QPoint &offset)
diff --git a/src/widgets/widgets/qcombobox.cpp b/src/widgets/widgets/qcombobox.cpp
index cf1d4a60fb..57a0834698 100644
--- a/src/widgets/widgets/qcombobox.cpp
+++ b/src/widgets/widgets/qcombobox.cpp
@@ -319,12 +319,12 @@ void QComboBoxPrivate::trySetValidIndex()
setCurrentIndex(QModelIndex());
}
-QRect QComboBoxPrivate::popupGeometry() const
+QRect QComboBoxPrivate::popupGeometry(const QPoint &globalPosition) const
{
Q_Q(const QComboBox);
return QStylePrivate::useFullScreenForPopup()
- ? QWidgetPrivate::screenGeometry(q)
- : QWidgetPrivate::availableScreenGeometry(q);
+ ? QWidgetPrivate::screenGeometry(q, globalPosition)
+ : QWidgetPrivate::availableScreenGeometry(q, globalPosition);
}
bool QComboBoxPrivate::updateHoverControl(const QPoint &pos)
@@ -2612,7 +2612,7 @@ void QComboBox::showPopup()
QComboBoxPrivateContainer* container = d->viewContainer();
QRect listRect(style->subControlRect(QStyle::CC_ComboBox, &opt,
QStyle::SC_ComboBoxListBoxPopup, this));
- QRect screen = d->popupGeometry();
+ QRect screen = d->popupGeometry(mapToGlobal(listRect.topLeft()));
QPoint below = mapToGlobal(listRect.bottomLeft());
int belowHeight = screen.bottom() - below.y();
diff --git a/src/widgets/widgets/qcombobox_p.h b/src/widgets/widgets/qcombobox_p.h
index bff6126d3e..b3adb4be69 100644
--- a/src/widgets/widgets/qcombobox_p.h
+++ b/src/widgets/widgets/qcombobox_p.h
@@ -371,7 +371,7 @@ public:
void updateArrow(QStyle::StateFlag state);
bool updateHoverControl(const QPoint &pos);
void trySetValidIndex();
- QRect popupGeometry() const;
+ QRect popupGeometry(const QPoint &globalPos) const;
QStyle::SubControl newHoverControl(const QPoint &pos);
int computeWidthHint() const;
QSize recomputeSizeHint(QSize &sh) const;