Revision control
++ // Copyright (C) 2016 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
++
++ /*!
++ \example painting/imagecomposition
++ \title Image Composition Example
++ \examplecategory {Graphics}
++ \ingroup examples-painting
++ \ingroup examples-layout
++ \brief Shows how composition modes work in QPainter.
++
++ \brief The Image Composition example lets the user combine images
++ together using any composition mode supported by QPainter, described
++ in detail in \l{QPainter#Composition Modes}{Composition Modes}.
++
++ \image imagecomposition-example.png
++ {Application that combines two images using composition modes}
++
++ \section1 Setting Up The Resource File
++
++ The Image Composition example requires two source images,
++ \e butterfly.png and \e checker.png that are embedded within
++ \e imagecomposition.qrc. The file contains the following code:
++
++ \quotefile painting/imagecomposition/imagecomposition.qrc
++
++ For more information on resource files, see \l{The Qt Resource System}.
++
++ \section1 ImageComposer Class Definition
++
++ The \c ImageComposer class is a subclass of QWidget that implements three
++ private slots, \c chooseSource(), \c chooseDestination(), and
++ \c recalculateResult().
++
++ \snippet painting/imagecomposition/imagecomposer.h 0
++
++ In addition, \c ImageComposer consists of five private functions,
++ \c addOp(), \c chooseImage(), \c loadImage(), \c currentMode(), and
++ \c imagePos(), as well as private instances of QToolButton, QComboBox,
++ QLabel, and QImage.
++
++ \snippet painting/imagecomposition/imagecomposer.h 1
++
++ \section1 ImageComposer Class Implementation
++
++ We declare a QSize object, \c resultSize, as a static constant with width
++ and height equal to 200.
++
++ \snippet painting/imagecomposition/imagecomposer.cpp 0
++
++ Within the constructor, we instantiate a QToolButton object,
++ \c sourceButton and set its \l{QAbstractButton::setIconSize()}{iconSize}
++ property to \c resultSize. The \c operatorComboBox is instantiated and
++ then populated using the \c addOp() function. This function accepts a
++ QPainter::CompositionMode, \a mode, and a QString, \a name, representing
++ the name of the composition mode.
++
++ \snippet painting/imagecomposition/imagecomposer.cpp 1
++
++ The \c destinationButton is instantiated and its
++ \l{QAbstractButton::setIconSize()}{iconSize} property is set to
++ \c resultSize as well. The \l{QLabel}s \c equalLabel and \c resultLabel
++ are created and \c{resultLabel}'s \l{QWidget::setMinimumWidth()}
++ {minimumWidth} is set.
++
++ \snippet painting/imagecomposition/imagecomposer.cpp 2
++
++ We connect the following signals to their corresponding slots:
++ \list
++ \li \c{sourceButton}'s \l{QPushButton::clicked()}{clicked()} signal is
++ connected to \c chooseSource(),
++ \li \c{operatorComboBox}'s \l{QComboBox::activated()}{activated()}
++ signal is connected to \c recalculateResult(), and
++ \li \c{destinationButton}'s \l{QToolButton::clicked()}{clicked()} signal
++ is connected to \c chooseDestination().
++ \endlist
++
++ \snippet painting/imagecomposition/imagecomposer.cpp 3
++
++ A QGridLayout, \c mainLayout, is used to place all the widgets. Note
++ that \c{mainLayout}'s \l{QLayout::setSizeConstraint()}{sizeConstraint}
++ property is set to QLayout::SetFixedSize, which means that
++ \c{ImageComposer}'s size cannot be resized at all.
++
++ \snippet painting/imagecomposition/imagecomposer.cpp 4
++
++ We create a QImage, \c resultImage, and we invoke \c loadImage() twice
++ to load both the image files in our \e imagecomposition.qrc file. Then,
++ we set the \l{QWidget::setWindowTitle()}{windowTitle} property to
++ "Image Composition".
++
++ \snippet painting/imagecomposition/imagecomposer.cpp 5
++
++ The \c chooseSource() and \c chooseDestination() functions are
++ convenience functions that invoke \c chooseImage() with specific
++ parameters.
++
++ \snippet painting/imagecomposition/imagecomposer.cpp 6
++ \codeline
++ \snippet painting/imagecomposition/imagecomposer.cpp 7
++
++ The \c chooseImage() function loads an image of the user's choice,
++ depending on the \a title, \a image, and \a button.
++
++ \snippet painting/imagecomposition/imagecomposer.cpp 10
++
++ The \c recalculateResult() function is used to calculate amd display the
++ result of combining the two images together with the user's choice of
++ composition mode.
++
++ \snippet painting/imagecomposition/imagecomposer.cpp 8
++
++ The \c addOp() function adds an item to the \c operatorComboBox using
++ \l{QComboBox}'s \l{QComboBox::addItem()}{addItem} function. This function
++ accepts a QPainter::CompositionMode, \a mode, and a QString, \a name. The
++ rectangle is filled with Qt::Transparent and both the \c sourceImage and
++ \c destinationImage are painted, before displaying it on \c resultLabel.
++
++ \snippet painting/imagecomposition/imagecomposer.cpp 9
++
++ The \c loadImage() function paints a transparent background using
++ \l{QPainter::fillRect()}{fillRect()} and draws \c image in a
++ centralized position using \l{QPainter::drawImage()}{drawImage()}.
++ This \c image is then set as the \c{button}'s icon.
++
++ \snippet painting/imagecomposition/imagecomposer.cpp 11
++
++ The \c currentMode() function returns the composition mode currently
++ selected in \c operatorComboBox.
++
++ \snippet painting/imagecomposition/imagecomposer.cpp 12
++
++ We use the \c imagePos() function to ensure that images loaded onto the
++ QToolButton objects, \c sourceButton and \c destinationButton, are
++ centralized.
++
++ \snippet painting/imagecomposition/imagecomposer.cpp 13
++
++ \section1 The \c main() Function
++
++ The \c main() function instantiates QApplication and \c ImageComposer
++ and invokes its \l{QWidget::show()}{show()} function.
++
++ \snippet painting/imagecomposition/main.cpp 0
++
++ */