summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/src/examples/screenshot.qdoc15
-rw-r--r--examples/desktop/screenshot/screenshot.cpp4
-rw-r--r--src/gui/kernel/qscreen.h2
-rw-r--r--src/plugins/platforms/windows/qwindowsscreen.cpp2
-rw-r--r--src/plugins/platforms/xcb/qxcbscreen.cpp10
5 files changed, 20 insertions, 13 deletions
diff --git a/doc/src/examples/screenshot.qdoc b/doc/src/examples/screenshot.qdoc
index cf6e68b6df..4723d3d43c 100644
--- a/doc/src/examples/screenshot.qdoc
+++ b/doc/src/examples/screenshot.qdoc
@@ -172,16 +172,15 @@
\snippet examples/desktop/screenshot/screenshot.cpp 5
- We take the screenshot using the static QPixmap::grabWindow()
+ Using the static function QApplication::primaryScreen(), we
+ obtain the QScreen object for the application's main screen.
+
+ We take the screenshot using the QScreen::grabWindow()
function. The function grabs the contents of the window passed as
an argument, makes a pixmap out of it and returns that pixmap.
-
- We identify the argument window using the QWidget::winID()
- function which returns the window system identifier. Here it
- returns the identifier of the current QDesktopWidget retrieved by
- the QApplication::desktop() function. The QDesktopWidget class
- provides access to screen information, and inherits
- QWidget::winID().
+ The window id can be obtained with QWidget::winId() or QWindow::winId().
+ Here, however, we just pass 0 as the window id, indicating that we
+ want to grab the entire screen.
We update the screenshot preview label using the private \c
updateScreenshotLabel() function. Then we enable the \uicontrol {New
diff --git a/examples/desktop/screenshot/screenshot.cpp b/examples/desktop/screenshot/screenshot.cpp
index c9310c9e2f..12c6bee6d4 100644
--- a/examples/desktop/screenshot/screenshot.cpp
+++ b/examples/desktop/screenshot/screenshot.cpp
@@ -115,7 +115,9 @@ void Screenshot::shootScreen()
originalPixmap = QPixmap(); // clear image for low memory situations
// on embedded devices.
//! [5]
- originalPixmap = QPixmap::grabWindow(QApplication::desktop()->winId());
+ QScreen *screen = QGuiApplication::primaryScreen();
+ if (screen)
+ originalPixmap = screen->grabWindow(0);
updateScreenshotLabel();
newScreenshotButton->setDisabled(false);
diff --git a/src/gui/kernel/qscreen.h b/src/gui/kernel/qscreen.h
index 6c142162fe..2d88413ad6 100644
--- a/src/gui/kernel/qscreen.h
+++ b/src/gui/kernel/qscreen.h
@@ -129,7 +129,7 @@ public:
bool isPortrait(Qt::ScreenOrientation orientation) const;
bool isLandscape(Qt::ScreenOrientation orientation) const;
- QPixmap grabWindow(WId window, int x, int y, int w, int h);
+ QPixmap grabWindow(WId window, int x = 0, int y = 0, int w = -1, int h = -1);
qreal refreshRate() const;
diff --git a/src/plugins/platforms/windows/qwindowsscreen.cpp b/src/plugins/platforms/windows/qwindowsscreen.cpp
index bb2dd579ee..231327e580 100644
--- a/src/plugins/platforms/windows/qwindowsscreen.cpp
+++ b/src/plugins/platforms/windows/qwindowsscreen.cpp
@@ -183,6 +183,8 @@ Q_GUI_EXPORT QPixmap qt_pixmapFromWinHBITMAP(HBITMAP bitmap, int hbitmapFormat =
QPixmap QWindowsScreen::grabWindow(WId window, int x, int y, int width, int height) const
{
+ // TODO: handle window==0, i.e. grab whole screen
+
if (QWindowsContext::verboseIntegration)
qDebug() << __FUNCTION__ << window << x << y << width << height;
RECT r;
diff --git a/src/plugins/platforms/xcb/qxcbscreen.cpp b/src/plugins/platforms/xcb/qxcbscreen.cpp
index 0b362c5256..d92004b1ac 100644
--- a/src/plugins/platforms/xcb/qxcbscreen.cpp
+++ b/src/plugins/platforms/xcb/qxcbscreen.cpp
@@ -277,6 +277,13 @@ QPixmap QXcbScreen::grabWindow(WId window, int x, int y, int width, int height)
if (width == 0 || height == 0)
return QPixmap();
+ // TODO: handle multiple screens
+ QXcbScreen *screen = const_cast<QXcbScreen *>(this);
+ xcb_window_t root = screen->root();
+
+ if (window == 0)
+ window = root;
+
xcb_get_geometry_cookie_t geometry_cookie = xcb_get_geometry_unchecked(xcb_connection(), window);
xcb_get_geometry_reply_t *reply =
@@ -291,9 +298,6 @@ QPixmap QXcbScreen::grabWindow(WId window, int x, int y, int width, int height)
if (height < 0)
height = reply->height - y;
- // TODO: handle multiple screens
- QXcbScreen *screen = const_cast<QXcbScreen *>(this);
- xcb_window_t root = screen->root();
geometry_cookie = xcb_get_geometry_unchecked(xcb_connection(), root);
xcb_get_geometry_reply_t *root_reply =
xcb_get_geometry_reply(xcb_connection(), geometry_cookie, NULL);