?? scribblearea.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 + -