diff options
-rw-r--r-- | doc/src/examples/screenshot.qdoc | 15 | ||||
-rw-r--r-- | examples/desktop/screenshot/screenshot.cpp | 4 | ||||
-rw-r--r-- | src/gui/kernel/qscreen.h | 2 | ||||
-rw-r--r-- | src/plugins/platforms/windows/qwindowsscreen.cpp | 2 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbscreen.cpp | 10 |
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); |