/****************************************************************************
**
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** 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 Nokia Corporation and its Subsidiary(-ies) 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 <QtGui>#include "scribblearea.h"
ScribbleArea::ScribbleArea(QWidget*parent)
: QWidget(parent)
{
setAttribute(Qt::WA_StaticContents);
modified =false;
scribbling =false;
myPenWidth =1;
myPenColor =Qt::blue;
}
bool ScribbleArea::openImage(constQString&fileName)
{
QImage loadedImage;
if (!loadedImage.load(fileName))
returnfalse;
QSize newSize = loadedImage.size().expandedTo(size());
resizeImage(&loadedImage, newSize);
image = loadedImage;
modified =false;
update();
returntrue;
}
bool ScribbleArea::saveImage(constQString&fileName,constchar*fileFormat)
{
QImage visibleImage = image;
resizeImage(&visibleImage, size());
if (visibleImage.save(fileName, fileFormat)) {
modified =false;
returntrue;
} else {
returnfalse;
}
}
void ScribbleArea::setPenColor(constQColor&newColor)
{
myPenColor = newColor;
}
void ScribbleArea::setPenWidth(int newWidth)
{
myPenWidth = newWidth;
}
void ScribbleArea::clearImage()
{
image.fill(qRgb(255,255,255));
modified =true;
update();
}
void ScribbleArea::mousePressEvent(QMouseEvent*event)
{
if (event->button() ==Qt::LeftButton) {
lastPoint = event->pos();
scribbling =true;
}
}
void ScribbleArea::mouseMoveEvent(QMouseEvent*event)
{
if ((event->buttons() &Qt::LeftButton) && scribbling)
drawLineTo(event->pos());
}
void ScribbleArea::mouseReleaseEvent(QMouseEvent*event)
{
if (event->button() ==Qt::LeftButton && scribbling) {
drawLineTo(event->pos());
scribbling =false;
}
}
void ScribbleArea::paintEvent(QPaintEvent*event)
{
QPainter painter(this);
QRect dirtyRect = event->rect();
painter.drawImage(dirtyRect, image, dirtyRect);
}
void ScribbleArea::resizeEvent(QResizeEvent*event)
{
if (width() > image.width() || height() > image.height()) {
int newWidth =qMax(width() +128, image.width());
int newHeight =qMax(height() +128, image.height());
resizeImage(&image,QSize(newWidth, newHeight));
update();
}
QWidget::resizeEvent(event);
}
void ScribbleArea::drawLineTo(constQPoint&endPoint)
{
QPainter painter(&image);
painter.setPen(QPen(myPenColor, myPenWidth,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin));
painter.drawLine(lastPoint, endPoint);
modified =true;
int rad = (myPenWidth /2) +2;
update(QRect(lastPoint, endPoint).normalized()
.adjusted(-rad,-rad,+rad,+rad));
lastPoint = endPoint;
}
void ScribbleArea::resizeImage(QImage*image,constQSize&newSize)
{
if (image->size() == newSize)
return;
QImage newImage(newSize,QImage::Format_RGB32);
newImage.fill(qRgb(255,255,255));
QPainter painter(&newImage);
painter.drawImage(QPoint(0,0),*image);
*image = newImage;
}
void ScribbleArea::print()
{
#ifndef QT_NO_PRINTERQPrinter printer(QPrinter::HighResolution);
QPrintDialog*printDialog =newQPrintDialog(&printer,this);
if (printDialog->exec() ==QDialog::Accepted) {
QPainter painter(&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_NO_PRINTER
}
Cette page est une traduction d'une page de la documentation de Qt, écrite par Nokia Corporation and/or its subsidiary(-ies). Les éventuels problèmes résultant d'une mauvaise traduction ne sont pas imputables à Nokia.
Vous avez déniché une erreur ? Un bug ? Une redirection cassée ? Ou tout autre problème, quel qu'il soit ? Ou bien vous désirez participer à ce projet de traduction ? N'hésitez pas à nous contacter
ou par MP !