blob: d4a5eac8a4ce6c20c8dcfe3b7105150357258661 [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:FDL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
** Documentation License version 1.3 as published by the Free Software
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
/*!
\page topics-graphics.html
\title Graphics
\brief Qt's graphics features
Graphics in Qt 5 is primarily done either through the imperative QPainter API,
or through Qt’s declarative UI language, Qt Quick, and its scene graph back-end.
Qt 5's graphics capabilities also includes support for printing, as well as the
loading and saving of various image formats.
\section1 2D Graphics with QPainter
QPainter provides API for drawing vector graphics, text and images
onto different surfaces, or QPaintDevice instances, such as QImage,
QOpenGLPaintDevice, QWidget, and QPrinter. The actual drawing happens
in the QPaintDevice's QPaintEngine. The software rasterizer and the
OpenGL (ES) 2.0 back-ends are the two most important QPaintEngine
implementations. The raster paint engine is Qt’s software rasterizer,
and is used when drawing on a QImage or QWidget. Its strength over the
OpenGL paint engine is its high quality when antialiasing is enabled,
and a complete feature set.
\sa {Paint System}
\list
\li \l {Paint System}{Paint System} - Overview over the QPainter
classes and architecture.
\li \l {Coordinate System}{Coordinate System} - Explains how
QPainter's coordinate system works.
\li \l {Drawing and Filling}{Drawing and Filling} - Explains how
QPainter performs filling and outlining of vector shapes.
\endlist
The most important rendering targets for QPainter are:
\list
\li \l {QImage}{QImage} - A hardware-independent image representation
with direct pixel access. QPainter will use the software
rasterizer to draw to QImage instances.
\li \l {QPixmap}{QPixmap} - A image representation suited for display
on screen. QPainter will primarily use the software rasterizer to
draw to QPixmap instances.
\li \l {QOpenGLPaintDevice}{QOpenGLPaintDevice} - A paint device to
render to the current OpenGL (ES) 2.0 context. QPainter will use
hardware accellerated OpenGL calls to draw to QOpenGLPaintDevice
instances.
\li \l {QBackingStore}{QBackingStore} - A backbuffer for top-level
windows. QPainter will primarily use the software rasterizer to
draw to QBackingStore instances.
\li \l {QWidget}{QWidget} - A baseclass for pre-Qt Quick user
interface classes. QPainter will render widgets using a
QBackingStore.
\li \l {QOpenGLWidget}{QOpenGLWidget} - A painter can also be
opened on a QOpenGLWidget. This is provided as a convenience, since
technically this is no different than using QOpenGLPaintDevice.
\endlist
QPainter and related classes are part of the \l {Qt GUI} module.
\section1 OpenGL and 3D
OpenGL is the most widely adopted graphics API for hardware accelerated and 3D
graphics, implemented on all desktop platforms and almost every mobile and
embedded platform. The Qt library contains a number of classes that help users
integrate graphics driven by OpenGL or other graphics API calls into their
applications, as well as add-on modules for displaying 3D content.
\list
\li \l {qtgui-index.html#opengl-and-opengl-es-integration}{OpenGL
in Qt GUI} - An overview of how OpenGL integrates with the \l{Qt GUI}
module.
\li \l {QOpenGLWidget}{QOpenGLWidget} is a widget that allows adding OpenGL
scenes into QWidget-based user interfaces.
\li \l {Mixing Scene Graph and the native graphics API}{OpenGL and Qt Quick 2.0}
- How to integrate application-provided graphics commands
(OpenGL, Vulkan, Direct3D, etc.) into a Qt Quick scene graph.
\li \l {http://www.khronos.org/opengl}{www.khronos.org/opengl} -
The official OpenGL pages.
\li \l {Qt Quick 3D} - An add-on module that provides a high-level API for
creating 3D content or UIs based on Qt Quick.
\li \l {Qt 3D} - An add-on module that provides functionality for near-realtime
simulation systems with support for 2D and 3D rendering, in both Qt C++ and
Qt Quick applications.
\endlist
Prior to Qt 5.0, OpenGL support in Qt was handled by the \l {Qt OpenGL}
module. This module is still present, but new code should aim to use
the new classes in the \l {Qt GUI} module. The classes are easily distinguisible
based on their names: Classes with the \c QGL prefix should not be used. Instead,
prefer the ones starting with \c QOpenGL.
\section1 Qt Quick Scene Graph
Qt Quick 2 introduces an OpenGL (ES) 2.0 scene graph for
rendering. It generally improves the performance of Qt Quick 2
significantly compared to the QGraphicsView/QPainter-based approach
used in earlier versions.
The scene graph is a graphical representation of the Item scene. It
can be thought of as a graphical deep copy, an independent structure
that contains enough information to render all the items. Once it has
been set up, it can be manipulated and rendered independently of the
state of the items. On many platforms, the scene graph will even be
rendered on a dedicated render thread while the GUI thread is
preparing the next frame's state.
The scene graph is used when you import QtQuick 2.x in your QML
file, and use QQuickView to run it.
\list
\li \l {qtquick-visualcanvas-scenegraph.html}{Qt Quick Scene Graph}
- Overview of the Qt Quick Scene Graph architecture.
\li \l {Scene Graph and Rendering} - Breakdown of the rendering of
each frame.
\endlist
Qt Quick can be mixed with raw OpenGL rendering by connecting to the
signals \l QQuickWindow::beforeRendering() or \l
QQuickWindow::afterRendering() which are emitted before and after the
Qt Quick scene graph is rendered, respectively. There signals are
emitted from the render thread (when applicable), and the connections
need to be direct.
Qt Quick can also be rendered using \l{Qt Quick 2D Renderer}. This raster
paint engine enables rendering Qt Quick applications on platforms that
do not have OpenGL.
\section1 Printing
Qt supports printing both directly to actual printers, locally or on the
network, as well as producing PDF output. How to do printing with
Qt is described in detail on the \l {Qt Print Support} page.
\section1 Images
Qt supports convenient reading, writing, and manipulating of images through the
QImage class. In addition, for more fine grained control of how images are
loaded or saved, you can use the QImageReader and QImageWriter classes
respectively. To add support for additional image formats, outside of the ones
provided by Qt, you can create image format plugins by using QImageIOHandler
and QImageIOPlugin.
See the \l {Reading and Writing Image Files} page for more information.
*/