Finger Paint Example▲
Sélectionnez
/**
**************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** 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.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
***************************************************************************
*/
#include <QtWidgets>
#if defined(QT_PRINTSUPPORT_LIB)
#include <QtPrintSupport/qtprintsupportglobal.h>
#if QT_CONFIG(printdialog)
#include <QPrinter>
#include <QPrintDialog>
#endif
#endif
#include
"scribblearea.h"
static
const
qreal MinimumDiameter =
3.0
;
static
const
qreal MaximumDiameter =
50.0
;
ScribbleArea::
ScribbleArea(QWidget *
parent)
:
QWidget(parent)
{
setAttribute(Qt::
WA_AcceptTouchEvents);
setAttribute(Qt::
WA_StaticContents);
modified =
false
;
myPenColors
&
lt;&
lt; QColor("green"
)
&
lt;&
lt; QColor("purple"
)
&
lt;&
lt; QColor("red"
)
&
lt;&
lt; QColor("blue"
)
&
lt;&
lt; QColor("yellow"
)
&
lt;&
lt; QColor("pink"
)
&
lt;&
lt; QColor("orange"
)
&
lt;&
lt; QColor("brown"
)
&
lt;&
lt; QColor("grey"
)
&
lt;&
lt; QColor("black"
);
}
bool
ScribbleArea::
openImage(const
QString &
amp;fileName)
{
QImage loadedImage;
if
(!
loadedImage.load(fileName))
return
false
;
QSize newSize =
loadedImage.size().expandedTo(size());
resizeImage(&
amp;loadedImage, newSize);
image =
loadedImage;
modified =
false
;
update();
return
true
;
}
bool
ScribbleArea::
saveImage(const
QString &
amp;fileName, const
char
*
fileFormat)
{
QImage visibleImage =
image;
resizeImage(&
amp;visibleImage, size());
if
(visibleImage.save(fileName, fileFormat)) {
modified =
false
;
return
true
;
}
else
{
return
false
;
}
}
void
ScribbleArea::
clearImage()
{
image.fill(qRgb(255
, 255
, 255
));
modified =
true
;
update();
}
void
ScribbleArea::
paintEvent(QPaintEvent *
event)
{
QPainter painter(this
);
const
QRect rect =
event-&
gt;rect();
painter.drawImage(rect.topLeft(), image, rect);
}
void
ScribbleArea::
resizeEvent(QResizeEvent *
event)
{
if
(width() &
gt; image.width() ||
height() &
gt; image.height()) {
int
newWidth =
qMax(width() +
128
, image.width());
int
newHeight =
qMax(height() +
128
, image.height());
resizeImage(&
amp;image, QSize(newWidth, newHeight));
update();
}
QWidget::
resizeEvent(event);
}
void
ScribbleArea::
resizeImage(QImage *
image, const
QSize &
amp;newSize)
{
if
(image-&
gt;size() ==
newSize)
return
;
QImage newImage(newSize, QImage::
Format_RGB32);
newImage.fill(qRgb(255
, 255
, 255
));
QPainter painter(&
amp;newImage);
painter.drawImage(QPoint(0
, 0
), *
image);
*
image =
newImage;
}
void
ScribbleArea::
print()
{
#if QT_CONFIG(printdialog)
QPrinter printer(QPrinter::
HighResolution);
QPrintDialog printDialog(&
amp;printer, this
);
if
(printDialog.exec() ==
QDialog::
Accepted) {
QPainter painter(&
amp;printer);
QRect rect =
painter.viewport();
QSize size =
image.size();
size.scale(rect.size(), Qt::
KeepAspectRatio);
painter.setViewport(rect.x(), rect.y(), size.width(), size.height());
painter.setWindow(image.rect());
painter.drawImage(0
, 0
, image);
}
#endif
// QT_CONFIG(printdialog)
}
bool
ScribbleArea::
event(QEvent *
event)
{
switch
(event-&
gt;type()) {
case
QEvent::
TouchBegin:
case
QEvent::
TouchUpdate:
case
QEvent::
TouchEnd:
{
QTouchEvent *
touch =
static_cast
&
lt;QTouchEvent *&
gt;(event);
QList&
lt;QTouchEvent::
TouchPoint&
gt; touchPoints =
static_cast
&
lt;QTouchEvent *&
gt;(event)-&
gt;touchPoints();
foreach (const
QTouchEvent::
TouchPoint &
amp;touchPoint, touchPoints) {
switch
(touchPoint.state()) {
case
Qt::
TouchPointStationary:
case
Qt::
TouchPointReleased:
// don't do anything if this touch point hasn't moved or has been released
continue
;
default
:
{
QRectF rect =
touchPoint.rect();
if
(rect.isEmpty()) {
qreal diameter =
MaximumDiameter;
if
(touch-&
gt;device()-&
gt;capabilities() &
amp; QTouchDevice::
Pressure)
diameter =
MinimumDiameter +
(MaximumDiameter -
MinimumDiameter) *
touchPoint.pressure();
rect.setSize(QSizeF(diameter, diameter));
}
QPainter painter(&
amp;image);
painter.setPen(Qt::
NoPen);
painter.setBrush(myPenColors.at(touchPoint.id() %
myPenColors.count()));
painter.drawEllipse(rect);
painter.end();
modified =
true
;
int
rad =
2
;
update(rect.toRect().adjusted(-
rad,-
rad, +
rad, +
rad));
}
break
;
}
}
break
;
}
default
:
return
QWidget::
event(event);
}
return
true
;
}