QScreen::grabWindow(): Scale the coordinates.
The coordinates need to be scaled before calling QPlatformScreen::grabWindow() On return, set a devicePixelRatio on the pixmap. Adapt the QWidget test to scale the grabbed pixmaps. Fixes pixeltool displaying the wrong part of the screen when High DPI scaling is in effect. Task-number: QTBUG-46615 Change-Id: I12de7df0da669230cf0fae74f4a42d43f061d5ff Reviewed-by: Morten Johan Sørvig <morten.sorvig@theqtcompany.com>
This commit is contained in:
parent
44357dbe42
commit
c0963486ce
@ -40,6 +40,7 @@
|
||||
|
||||
#include <QtCore/QDebug>
|
||||
#include <QtCore/private/qobject_p.h>
|
||||
#include "qhighdpiscaling_p.h"
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
@ -683,7 +684,19 @@ QPixmap QScreen::grabWindow(WId window, int x, int y, int width, int height)
|
||||
qWarning("invoked with handle==0");
|
||||
return QPixmap();
|
||||
}
|
||||
return platformScreen->grabWindow(window, x, y, width, height);
|
||||
const qreal factor = QHighDpiScaling::factor(this);
|
||||
if (qFuzzyCompare(factor, 1))
|
||||
return platformScreen->grabWindow(window, x, y, width, height);
|
||||
|
||||
const QPoint nativePos = QHighDpi::toNative(QPoint(x, y), factor);
|
||||
QSize nativeSize(width, height);
|
||||
if (nativeSize.isValid())
|
||||
nativeSize = QHighDpi::toNative(nativeSize, factor);
|
||||
QPixmap result =
|
||||
platformScreen->grabWindow(window, nativePos.x(), nativePos.y(),
|
||||
nativeSize.width(), nativeSize.height());
|
||||
result.setDevicePixelRatio(factor);
|
||||
return result;
|
||||
}
|
||||
|
||||
#ifndef QT_NO_DEBUG_STREAM
|
||||
|
@ -4979,7 +4979,9 @@ static inline QByteArray msgRgbMismatch(unsigned actual, unsigned expected)
|
||||
static QPixmap grabWindow(QWindow *window, int x, int y, int width, int height)
|
||||
{
|
||||
QScreen *screen = window->screen();
|
||||
return screen ? screen->grabWindow(window->winId(), x, y, width, height) : QPixmap();
|
||||
Q_ASSERT(screen);
|
||||
QPixmap result = screen->grabWindow(window->winId(), x, y, width, height);
|
||||
return result.devicePixelRatio() > 1 ? result.scaled(width, height) : result;
|
||||
}
|
||||
|
||||
#define VERIFY_COLOR(child, region, color) verifyColor(child, region, color, __LINE__)
|
||||
@ -8505,7 +8507,7 @@ void tst_QWidget::translucentWidget()
|
||||
#ifdef Q_OS_WIN
|
||||
QWidget *desktopWidget = QApplication::desktop()->screen(0);
|
||||
if (QSysInfo::windowsVersion() >= QSysInfo::WV_VISTA)
|
||||
widgetSnapshot = qApp->primaryScreen()->grabWindow(desktopWidget->winId(), labelPos.x(), labelPos.y(), label.width(), label.height());
|
||||
widgetSnapshot = grabWindow(desktopWidget->windowHandle(), labelPos.x(), labelPos.y(), label.width(), label.height());
|
||||
else
|
||||
#endif
|
||||
widgetSnapshot = label.grab(QRect(QPoint(0, 0), label.size()));
|
||||
|
Loading…
Reference in New Issue
Block a user