⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scribblearea.cpp

📁 利用Qt写的白板程序
💻 CPP
字号:
/******************************************************************************** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.**** This file is part of the example classes of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License versions 2.0 or 3.0 as published by the Free Software** Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3** included in the packaging of this file.  Alternatively you may (at** your option) use any later version of the GNU General Public** License if such license has been publicly approved by Trolltech ASA** (or its successors, if any) and the KDE Free Qt Foundation. In** addition, as a special exception, Trolltech gives you certain** additional rights. These rights are described in the Trolltech GPL** Exception version 1.1, which can be found at** http://www.trolltech.com/products/qt/gplexception/ and in the file** GPL_EXCEPTION.txt in this package.**** Please review the following information to ensure GNU General** Public Licensing requirements will be met:** http://trolltech.com/products/qt/licenses/licensing/opensource/. If** you are unsure which license is appropriate for your use, please** review the following information:** http://trolltech.com/products/qt/licenses/licensing/licensingoverview** or contact the sales department at sales@trolltech.com.**** In addition, as a special exception, Trolltech, as the sole** copyright holder for Qt Designer, grants users of the Qt/Eclipse** Integration plug-in the right for the Qt/Eclipse Integration to** link to functionality provided by Qt Designer and its related** libraries.**** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR** A PARTICULAR PURPOSE. Trolltech reserves all rights not expressly** granted herein.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#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(const QString &fileName){    QImage loadedImage;    if (!loadedImage.load(fileName))        return false;    QSize newSize = loadedImage.size().expandedTo(size());    resizeImage(&loadedImage, newSize);    image = loadedImage;    modified = false;    update();    return true;}bool ScribbleArea::saveImage(const QString &fileName, const char *fileFormat){    QImage visibleImage = image;    resizeImage(&visibleImage, size());    if (visibleImage.save(fileName, fileFormat)) {        modified = false;        return true;    } else {        return false;    }}void ScribbleArea::setPenColor(const QColor &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);    painter.drawImage(QPoint(0, 0), image);}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(const QPoint &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, const QSize &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(){    QPrinter printer(QPrinter::HighResolution);     QPrintDialog *printDialog = new QPrintDialog(&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);    }}/********************添加的函数********************//* * 读取共享去关于手的轨迹的数据 *//* 读取共享区的轨迹数据 */QPoint ScribbleArea::trackPosition(){	//用于共享内存的变量	int shm_id, i;	key_t key;	HandTrack *p_Track;	HandTrack Track;	//Qt相关的变量	QPoint point;	int x, y;	//创建key	key = ftok(PATH_HANDTRACK, 0);	if (key == -1)		perror("ftok error");	//得到共享区的id号	shm_id = shmget(key, HANDTRACK_SHM_SIZE,0660);	if (shm_id == -1) {		perror("shemget error");		exit(0);	}	//链接共享区	p_Track = (HandTrack *)shmat(shm_id, 0, 0);	//给共享区上锁	pthread_rwlock_rdlock(&(p_Track->rwlock));	//读取数据	Track.direction = (*p_Track).direction;	Track.distance = (*p_Track).distance;	//数据读取完毕,给共享区解锁	pthread_rwlock_unlock(&(p_Track->rwlock));	//断开共享内存的链接	if (shmdt(p_Track) == -1)		perror("in file trackRead.cpp detach error");	x = lastPoint.x();	y = lastPoint.y();	switch(Track.direction) {		case 0:			y += Track.distance;			break;		case 1:			y -= Track.distance;			break;		case 2:			x -= Track.distance;			break;		case 3:			x += Track.distance;			break;	}	point.setX(x);	point.setY(y);	return point;}/* * 读取共享区的手的坐标的数据,并初始化lastPoint */void ScribbleArea::InitPoint(){	//用于共享内存的变量	int shm_id, i;	key_t key;	Hand *p_Hand;	//用于Qt的变量	int x, y;	//创建key	key = ftok(PATH_HAND, 0);	if (key == -1)		perror("ftok error");	//得到共享区的id号	shm_id = shmget(key, HAND_SHM_SIZE,0660);	if (shm_id == -1) {		perror("shemget error");		exit(0);	}	//链接共享区	p_Hand = (Hand *)shmat(shm_id, 0, 0);	//给共享区上锁	pthread_rwlock_rdlock(&(p_Hand->rwlock));	//读取数据	x = (*p_Hand).x;	y = (*p_Hand).y;	//数据读取完毕,给共享区解锁	pthread_rwlock_unlock(&(p_Track->rwlock));	//断开共享内存的链接	if (shmdt(p_Track) == -1)		perror("in file trackRead.cpp detach error");	//初始化lastPoint	lastPoint.setX(x);	lastPoint.setY(y);}void sigusr(int signo){	QPoint endPoint;	switch (signo) {		case SIGDRAW:			endPoint = trackPosition();			drawLineTo(endPoint);			break;		case SIGSTART:			InitPoint();			break;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -