commit f362baa658b28e24f7052d7d62a78b5eb794dd5c Author: sonichy Date: Mon May 15 10:51:16 2017 +0800 新文件: HTYPaint 新文件: HTYPaint.desktop 新文件: HTYPaint.pro 新文件: MirrorHorizontal.png 新文件: MirrorVertical.png 新文件: README.md 新文件: blur.jpg 新文件: clip.png 新文件: color_picker.png 新文件: ellipse.png 新文件: eraser.png 新文件: filename.qrc 新文件: fill.png 新文件: gray.png 新文件: icon.png 新文件: imagewidget.cpp 新文件: imagewidget.h 新文件: invert.png 新文件: line.png 新文件: main.cpp 新文件: mainwindow.cpp 新文件: mainwindow.h 新文件: mainwindow.ui 新文件: move.png 新文件: pencil.png 新文件: preview.png 新文件: rect.png 新文件: rectselect.png 新文件: rl.png 新文件: rr.png 新文件: text.png 新文件: zoom1.png 新文件: zoomin.png 新文件: zoomout.png diff --git a/HTYPaint b/HTYPaint new file mode 100644 index 0000000..3d74238 Binary files /dev/null and b/HTYPaint differ diff --git a/HTYPaint.desktop b/HTYPaint.desktop new file mode 100644 index 0000000..16440ce --- /dev/null +++ b/HTYPaint.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Name=HTYPaint +Comment= +Exec=/media/sonichy/job/HY/Linux/Qt/HTYPaint/HTYPaint +Icon=/media/sonichy/job/HY/Linux/Qt/HTYPaint/icon.png +Path=/media/sonichy/job/HY/Linux/Qt/HTYPaint +Terminal=false +Type=Application +MimeType= +Categories= \ No newline at end of file diff --git a/HTYPaint.pro b/HTYPaint.pro new file mode 100644 index 0000000..b814adc --- /dev/null +++ b/HTYPaint.pro @@ -0,0 +1,25 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2016-12-13T09:09:45 +# +#------------------------------------------------- + +QT += core gui + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +TARGET = HTYPaint +TEMPLATE = app + + +SOURCES += main.cpp\ + mainwindow.cpp \ + imagewidget.cpp + +HEADERS += mainwindow.h \ + imagewidget.h + +FORMS += mainwindow.ui + +RESOURCES += \ + filename.qrc diff --git a/MirrorHorizontal.png b/MirrorHorizontal.png new file mode 100644 index 0000000..61f4c60 Binary files /dev/null and b/MirrorHorizontal.png differ diff --git a/MirrorVertical.png b/MirrorVertical.png new file mode 100644 index 0000000..3897688 Binary files /dev/null and b/MirrorVertical.png differ diff --git a/README.md b/README.md new file mode 100644 index 0000000..c799736 --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +# Qt 海天鹰画图 +![alt](preview.png) +Linux 平台基于 Qt 的迷你画图程序。 +已编译好的 HTYPaint 程序适用64位Linux系统Qt5环境,双击运行,其他版本自行编译。 + +### 1.4 新增绘制透明图形 +### 1.3 新增模糊 +![alt](blur.jpg) +### 1.2 新增导入图形 +### 1.1 新增灰度和反色 +![alt](gray.png) +![alt](invert.png) \ No newline at end of file diff --git a/blur.jpg b/blur.jpg new file mode 100644 index 0000000..cfff40e Binary files /dev/null and b/blur.jpg differ diff --git a/clip.png b/clip.png new file mode 100644 index 0000000..e2303e4 Binary files /dev/null and b/clip.png differ diff --git a/color_picker.png b/color_picker.png new file mode 100644 index 0000000..867b8e2 Binary files /dev/null and b/color_picker.png differ diff --git a/ellipse.png b/ellipse.png new file mode 100644 index 0000000..bd8bbc3 Binary files /dev/null and b/ellipse.png differ diff --git a/eraser.png b/eraser.png new file mode 100644 index 0000000..b906bd2 Binary files /dev/null and b/eraser.png differ diff --git a/filename.qrc b/filename.qrc new file mode 100644 index 0000000..367a52a --- /dev/null +++ b/filename.qrc @@ -0,0 +1,23 @@ + + + icon.png + clip.png + ellipse.png + eraser.png + line.png + move.png + pencil.png + rect.png + rectselect.png + text.png + fill.png + zoomin.png + zoomout.png + zoom1.png + rl.png + rr.png + MirrorHorizontal.png + MirrorVertical.png + color_picker.png + + diff --git a/fill.png b/fill.png new file mode 100644 index 0000000..fb67cfb Binary files /dev/null and b/fill.png differ diff --git a/gray.png b/gray.png new file mode 100644 index 0000000..a1654ac Binary files /dev/null and b/gray.png differ diff --git a/icon.png b/icon.png new file mode 100644 index 0000000..e01bce8 Binary files /dev/null and b/icon.png differ diff --git a/imagewidget.cpp b/imagewidget.cpp new file mode 100644 index 0000000..2ee17fb --- /dev/null +++ b/imagewidget.cpp @@ -0,0 +1,651 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" +#include "imagewidget.h" +#include +#include +#include +#include +#include +#include +#include +//#include + +QImage imgload,imgpaste; +int cundo=0; + +ImageWidget::ImageWidget(QWidget *parent) + : QWidget(parent) +{ + labelFont=new QLabel; + //imgtemp=QImage(600,500,QImage::Format_RGB32); + //imgtemp.fill(Qt::white); + //image=imgtemp; + newfile(); + pen.setColor(Qt::black); + pen.setWidth(1); + brush=QBrush(Qt::transparent,Qt::SolidPattern); + brush.setColor(Qt::black); + boolBorder=true; + boolFill=false; + connect(new QShortcut(QKeySequence(Qt::ALT + Qt::Key_Up),this), SIGNAL(activated()),this, SLOT(moveUp())); + connect(new QShortcut(QKeySequence(Qt::ALT + Qt::Key_Down),this), SIGNAL(activated()),this, SLOT(moveDown())); + connect(new QShortcut(QKeySequence(Qt::ALT + Qt::Key_Left),this), SIGNAL(activated()),this, SLOT(moveLeft())); + connect(new QShortcut(QKeySequence(Qt::ALT + Qt::Key_Right),this), SIGNAL(activated()),this, SLOT(moveRight())); + connect(new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Up),this), SIGNAL(activated()),this, SLOT(moveTopUp())); + connect(new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Down),this), SIGNAL(activated()),this, SLOT(moveTopDown())); + connect(new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Left),this), SIGNAL(activated()),this, SLOT(moveLeftLeft())); + connect(new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Right),this), SIGNAL(activated()),this, SLOT(moveLeftRight())); + connect(new QShortcut(QKeySequence(Qt::SHIFT + Qt::Key_Left),this), SIGNAL(activated()),this, SLOT(moveRightLeft())); + connect(new QShortcut(QKeySequence(Qt::SHIFT + Qt::Key_Right),this), SIGNAL(activated()),this, SLOT(moveRightRight())); + connect(new QShortcut(QKeySequence(Qt::SHIFT + Qt::Key_Up),this), SIGNAL(activated()),this, SLOT(moveBottomUp())); + connect(new QShortcut(QKeySequence(Qt::SHIFT + Qt::Key_Down),this), SIGNAL(activated()),this, SLOT(moveBottomDown())); +} + +ImageWidget::~ImageWidget() +{ + +} + +void ImageWidget::paintEvent(QPaintEvent *) +{ + QPainter painter(this); + painter.drawImage(0,0,imgtemp); +} + +void ImageWidget::draw(QImage &img){ + QPainter painter(&img); + painter.setPen(pen); + switch(draw_type){ + case POINT_DRAW: + painter.drawLine(startPnt,endPnt); + break; + case LINE_DRAW: + painter.drawLine(startPnt,endPnt); + break; + case RECT_DRAW:{ + if(boolFill){painter.setBrush(brush);}else{painter.setBrush(QBrush(Qt::transparent,Qt::SolidPattern));} + QRect rect(startPnt,endPnt); + if(!boolBorder){pen.setColor(Qt::transparent);} + painter.drawRect(rect); + break;} + case SELECT_DRAW:{ + painter.setPen(QPen(Qt::black,1,Qt::DashLine)); + painter.setBrush(QBrush(Qt::transparent,Qt::SolidPattern)); + QRect rect(startPnt,endPnt); + painter.drawRect(rect); + break;} + case ELLIPSE_DRAW:{ + QRect rect(startPnt,endPnt); + if(boolFill){painter.setBrush(brush);}else{painter.setBrush(QBrush(Qt::transparent,Qt::SolidPattern));} + painter.drawEllipse(rect); + break;} + case TEXT_DRAW: + painter.setFont(labelFont->font()); + painter.drawText(startPnt.x(),startPnt.y(),text); + break; + case FILL_DRAW: + break; + case ERASE_DRAW: + //painter.setPen(QPen(Qt::white,1)); + //painter.setBrush(QBrush(Qt::white,Qt::SolidPattern)); + painter.setBrush(QBrush(brush)); + painter.drawEllipse(endPnt.x(),endPnt.y(),20,20); + break; + case DEL_DRAW:{ + painter.setPen(QPen(Qt::white,1,Qt::SolidLine)); + painter.setBrush(QBrush(Qt::white,Qt::SolidPattern)); + QRect rect(startPnt,endPnt); + painter.drawRect(rect); + painter.setPen(pen); + painter.setBrush(brush); + draw_type=SELECT_DRAW; + break;} + case MOVE_DRAW:{ + QRect target(endPnt,imgmove.size()); + QPoint p(0,0); + QRect source(p,imgmove.size()); + painter.drawImage(target,imgmove,source); + break;} + case COLORPICKER_DRAW: + QRgb RGB = imgtemp.pixel(startPnt.x(),startPnt.y()); + pen.setColor(RGB); + brush.setColor(RGB); + painter.setBrush(brush); + } + update(); +} + +void ImageWidget::mousePressEvent(QMouseEvent *e){ + startPnt = e->pos(); + endPnt = e->pos(); + //this->isPressed = true; + switch(draw_type){ + case TEXT_DRAW: + draw(imgtemp); + image=imgtemp; + moveImgbuf(); + cundo=0; + break; + case ERASE_DRAW: + draw(imgtemp); + image=imgtemp; + moveImgbuf(); + cundo=0; + break; + case COLORPICKER_DRAW: + draw(imgtemp); + } +} + +void ImageWidget::mouseMoveEvent(QMouseEvent *e){ + //if(this->isPressed){ + if(e->buttons() & Qt::LeftButton){ + endPnt = e->pos(); + switch(draw_type){ + case TEXT_DRAW: + break; + case POINT_DRAW: + draw(imgtemp); + startPnt = endPnt; + cundo=0; + moveImgbuf(); + break; + case ERASE_DRAW: + draw(imgtemp); + cundo=0; + moveImgbuf(); + break; + default: + imgtemp=image; + draw(imgtemp); + } + } + //if(draw_type==ERASE_DRAW){ + //qDebug()<<"mouseMove"<pos(); + // draw(imgtemp); + //ui->statusBar->showMessage(QString::number(e->pos().x())+","+QString::number(e->pos().y())); + //} + //static_cast(parent())->statusBar()->showMessage("mousemove"); + //static_cast(parent())->statusBar()->showMessage("("+QString::number(startPnt.x())+","+QString::number(startPnt.y())+") - ("+QString::number(endPnt.x())+","+QString::number(endPnt.y())+")"); + +} + +void ImageWidget::mouseReleaseEvent(QMouseEvent *e){ + //this->isPressed = false; + if(draw_type!=SELECT_DRAW && draw_type!=MOVE_DRAW){ + image=imgtemp; + moveImgbuf(); + cundo=0; + } + if(draw_type==MOVE_DRAW){ + imgtemp=image; + draw(imgtemp); + } +} + +void ImageWidget::zoomin() +{ + QImage imgzoom=imgtemp.scaled(imgtemp.width()*1.2,imgtemp.height()*1.2); + imgtemp=imgzoom; + //setMinimumSize(imgzoom.size()); + resize(imgzoom.size()); + update(); +} + +void ImageWidget::zoomout() +{ + QImage imgzoom=imgtemp.scaled(imgtemp.width()*0.8,imgtemp.height()*0.8); + imgtemp=imgzoom; + resize(imgzoom.size()); + setMinimumSize(imgzoom.size()); + update(); +} + +void ImageWidget::zoom1() +{ + imgtemp=imgload; + setMinimumSize(imgload.size()); + resize(imgload.size()); + update(); +} + +void ImageWidget::scale(int width,int height) +{ + QImage imgscale=imgtemp.scaled(width,height); + imgtemp=imgscale; + image=imgtemp; + resize(imgtemp.size()); + setMinimumSize(imgtemp.size()); + update(); +} + +void ImageWidget::rotate(qreal degrees) +{ + QMatrix matrix; + matrix.rotate(degrees); + QImage imgrotate=imgtemp.transformed(matrix,Qt::SmoothTransformation); + imgtemp=imgrotate; + image=imgtemp; + resize(imgrotate.size()); + update(); +} + +void ImageWidget::mirror(bool bh,bool bv) +{ + QImage imgmirror=imgtemp.mirrored(bh,bv); + imgtemp=imgmirror; + image=imgtemp; + resize(imgmirror.size()); + update(); +} + +void ImageWidget::drawPoint() +{ + image=imgtemp; + draw_type=POINT_DRAW; + pen.setJoinStyle(Qt::RoundJoin); + QCursor cursor; + QPixmap pixmap(":/pencil.png"); + cursor = QCursor(pixmap); + setCursor(cursor); +} +void ImageWidget::drawLine() +{ + image=imgtemp; + draw_type=LINE_DRAW; + QCursor cursor; + QPixmap pixmap(":/line.png"); + cursor = QCursor(pixmap); + setCursor(cursor); +} + +void ImageWidget::drawRect() +{ + image=imgtemp; + draw_type=RECT_DRAW; + //pen.setJoinStyle(Qt::MiterJoin); + QCursor cursor; + QPixmap pixmap(":/rect.png"); + cursor = QCursor(pixmap); + setCursor(cursor); +} + +void ImageWidget::drawEllipse() +{ + image=imgtemp; + draw_type=ELLIPSE_DRAW; + QCursor cursor; + QPixmap pixmap(":/ellipse.png"); + cursor = QCursor(pixmap); + setCursor(cursor); +} + +void ImageWidget::drawText() +{ + image=imgtemp; + draw_type=TEXT_DRAW; + QCursor cursor; + QPixmap pixmap(":/text.png"); + cursor = QCursor(pixmap); + setCursor(cursor); +} + +void ImageWidget::drawFill() +{ + image=imgtemp; + draw_type=FILL_DRAW; + QCursor cursor; + QPixmap pixmap(":/fill.png"); + cursor = QCursor(pixmap); + setCursor(cursor); +} + +void ImageWidget::drawErase() +{ + image=imgtemp; + draw_type=ERASE_DRAW; + QCursor cursor; + QPixmap pixmap(":/eraser.png"); + cursor = QCursor(pixmap); + setCursor(cursor); + //spinbox->setValue(20); +} + +void ImageWidget::drawMove() +{ + if(draw_type==SELECT_DRAW){ + imgmove=imgtemp.copy(startPnt.x()+1,startPnt.y()+1,endPnt.x()-startPnt.x()-1,endPnt.y()-startPnt.y()-1); + }else{ + imgmove=imgpaste; + } + draw_type=MOVE_DRAW; + QCursor cursor; + QPixmap pixmap(":/move.png"); + cursor = QCursor(pixmap); + setCursor(cursor); +} + +void ImageWidget::drawRectselect() +{ + image=imgtemp; + draw_type=SELECT_DRAW; + QCursor cursor; + QPixmap pixmap(":/rectselect.png"); + cursor = QCursor(pixmap); + setCursor(cursor); +} + +void ImageWidget::colorPicker() +{ + draw_type=COLORPICKER_DRAW; + QCursor cursor; + QPixmap pixmap(":/color_picker.png"); + cursor = QCursor(pixmap); + setCursor(cursor); +} + +void ImageWidget::selectAll() +{ + //image=imgtemp; + draw_type=SELECT_DRAW; + startPnt=QPoint(0,0); + endPnt=QPoint(imgtemp.width()-2,imgtemp.height()-2); + draw(imgtemp); +} + +void ImageWidget::delSelect() +{ + image=imgtemp; + draw_type=DEL_DRAW; + draw(imgtemp); + image=imgtemp; +} + +void ImageWidget::newfile() +{ + QImage imgnew=QImage(600,500,QImage::Format_ARGB32); + //imgnew.fill(Qt::transparent); + imgtemp=imgnew; + image=imgnew; + setMinimumSize(imgnew.size()); + resize(imgnew.size()); + update(); +} + +void ImageWidget::load(QString fileName) +{ + imgload.load(fileName); + imgtemp=imgload; + image=imgload; + setMinimumSize(imgload.size()); + update(); + draw_type=NONE_DRAW; + setCursor(Qt::ArrowCursor); + cundo=0; + for(int i=0;i<10;i++){ + imgbuf[i]=image; + } +} + +void ImageWidget::save(QString path) +{ + image.save(path,0,100); +} + +void ImageWidget::cutSelect() +{ + imgtemp=imgtemp.copy(startPnt.x()+1,startPnt.y()+1,endPnt.x()-startPnt.x()-1,endPnt.y()-startPnt.y()-1); + image=imgtemp; + resize(imgtemp.size()); + setMinimumSize(imgtemp.size()); + update(); +} + +void ImageWidget::newsize(int width,int height) +{ + imgtemp=QImage(width,height,QImage::Format_ARGB32); + imgtemp.fill(Qt::transparent); + QPainter painter(&imgtemp); + painter.drawImage(0,0,image); + resize(imgtemp.size()); + setMinimumSize(imgtemp.size()); + update(); + image=imgtemp; +} + +void ImageWidget::copy() +{ + if(draw_type==SELECT_DRAW){ + QImage imgcopy=imgtemp.copy(startPnt.x()+1,startPnt.y()+1,endPnt.x()-startPnt.x()-1,endPnt.y()-startPnt.y()-1); + QApplication::clipboard()->setImage(imgcopy, QClipboard::Clipboard); + //ui->statusBar->showMessage("选区已复制到剪贴板"); + } +} + +void ImageWidget::paste() +{ + //image=imgtemp; + imgpaste=QApplication::clipboard()->image(); + QPainter painter(&imgtemp); + painter.drawImage(0,0,imgpaste); + update(); + //ui->statusBar->showMessage("剪贴板已粘贴"); +} + +void ImageWidget::moveUp() +{ + if(startPnt.y()>0 && endPnt.y()>0){ + imgtemp=image; + startPnt.setY(startPnt.y()-1); + endPnt.setY(endPnt.y()-1); + draw(imgtemp); + } +} + +void ImageWidget::moveDown() +{ + if(endPnt.y()0 && endPnt.x()>0){ + imgtemp=image; + startPnt.setX(startPnt.x()-1); + endPnt.setX(endPnt.x()-1); + draw(imgtemp); + } +} + +void ImageWidget::moveRight() +{ + if(endPnt.x()0){ + imgtemp=image; + startPnt.setY(startPnt.y()-1); + draw(imgtemp); + } +} + +void ImageWidget::moveTopDown() +{ + if(startPnt.y()0){ + imgtemp=image; + startPnt.setX(startPnt.x()-1); + draw(imgtemp); + } +} + +void ImageWidget::moveLeftRight() +{ + if(startPnt.x()0){ + imgtemp=image; + endPnt.setX(endPnt.x()-1); + draw(imgtemp); + } +} + +void ImageWidget::moveRightRight() +{ + if(endPnt.x()0){ + imgtemp=image; + endPnt.setY(endPnt.y()-1); + draw(imgtemp); + } +} + +void ImageWidget::moveBottomDown() +{ + if(endPnt.y()0;i--){ + imgbuf[i]=imgbuf[i-1]; + //qDebug() << "imgbuf" << i << "=" << i-1; + } + imgbuf[0]=imgtemp; +} + +void ImageWidget::undo() +{ + qDebug() << "undo" << cundo; + if(cundo<10){ + imgtemp=imgbuf[cundo]; + image=imgtemp; + //draw(imgtemp); + update(); + cundo++; + } +} + +void ImageWidget::redo() +{ + qDebug() << "redo" << cundo; + if(cundo==10)cundo--; + if(cundo>=0){ + imgtemp=imgbuf[cundo]; + image=imgtemp; + //draw(imgtemp); + update(); + cundo--; + } +} + +void ImageWidget::gray() +{ + int w,h; + w = imgtemp.width(); + h = imgtemp.height(); + QImage imgGray(w,h,QImage::Format_RGB32); + for(int x=0; xendPnt.x() && startPnt.y()endPnt.x() && startPnt.y()>endPnt.y()){xs=endPnt.x();ys=endPnt.y();xe=startPnt.x();ye=startPnt.y();} + if(startPnt.x()endPnt.y()){xs=startPnt.x();ys=endPnt.y();xe=endPnt.x();ye=startPnt.y();} + QImage imgBlur(qAbs(endPnt.x()-startPnt.x())+2,qAbs(endPnt.y()-startPnt.y())+2,QImage::Format_RGB32); + for(int x=xs; x0 && yb>0 && xa +#include +#include +//线段 +//typedef struct myLine{ +// QPoint startPnt; +// QPoint endPnt; +//}myLine; + +class ImageWidget : public QWidget +{ + Q_OBJECT + +public: + enum /*定义图形的类型 */ + { + NONE_DRAW, + POINT_DRAW, + LINE_DRAW, + RECT_DRAW, + ELLIPSE_DRAW, + TEXT_DRAW, + FILL_DRAW, + ERASE_DRAW, + MOVE_DRAW, + SELECT_DRAW, + CLIP_DRAW, + IMAGE_DRAW, + DEL_DRAW, + COLORPICKER_DRAW + } draw_type; + ImageWidget(QWidget *parent = 0); + ~ImageWidget(); + QImage image,imgtemp,imgbuf[10],imgmove; + QPoint startPnt; //起点 + QPoint endPnt; //终点 + QPen pen; + QBrush brush; + QString text; + QLabel *labelFont; + bool boolBorder,boolFill; + void newfile(); + void load(QString fileName); + void save(QString path); + void setAngle(qreal rotateAngle); + void zoomin(); + void zoomout(); + void zoom1(); + void rotate(qreal degrees); + void mirror(bool bh,bool bv); + void drawPoint(); + void drawLine(); + void drawRect(); + void drawEllipse(); + void drawText(); + void drawFill(); + void drawErase(); + void drawMove(); + void drawRectselect(); + void colorPicker(); + void cutSelect(); + void delSelect(); + void copy(); + void paste(); + void draw(QImage &img); + void newsize(int width,int height); + void scale(int ratioW,int ratioH); + void moveImgbuf(); + void selectAll(); + void gray(); + void invert(); + void blur(int p); + +public slots: + void undo(); + void redo(); + +private slots: + void moveUp(); + void moveDown(); + void moveLeft(); + void moveRight(); + void moveTopUp(); + void moveTopDown(); + void moveLeftLeft(); + void moveLeftRight(); + void moveRightLeft(); + void moveRightRight(); + void moveBottomUp(); + void moveBottomDown(); + +protected: + void paintEvent(QPaintEvent *); + +private: + void mousePressEvent(QMouseEvent *e); + void mouseMoveEvent(QMouseEvent *e); + void mouseReleaseEvent(QMouseEvent *e); + +}; + +#endif // IMAGEWIDGET_H diff --git a/invert.png b/invert.png new file mode 100644 index 0000000..94b160e Binary files /dev/null and b/invert.png differ diff --git a/line.png b/line.png new file mode 100644 index 0000000..3b1dddd Binary files /dev/null and b/line.png differ diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..7d28f27 --- /dev/null +++ b/main.cpp @@ -0,0 +1,20 @@ +#include "mainwindow.h" +#include +#if QT_VERSION < QT_VERSION_CHECK(5,0,0) +#include +#endif + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); +#if QT_VERSION < QT_VERSION_CHECK(5,0,0) + QTextCodec *tc = QTextCodec::codecForName("UTF-8"); + QTextCodec::setCodecForTr(tc); + QTextCodec::setCodecForLocale(QTextCodec::codecForLocale()); + QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale()); +#endif + + MainWindow w; + w.show(); + return a.exec(); +} diff --git a/mainwindow.cpp b/mainwindow.cpp new file mode 100644 index 0000000..472021d --- /dev/null +++ b/mainwindow.cpp @@ -0,0 +1,560 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +QToolButton *btnColorFill,*btnColorBorder; +QLineEdit *lineEdit; +QSpinBox *spinbox,*spinw,*spinwr,*spinh,*spinhr; +QString text="文字内容",path=""; +QColor colorf; +QCheckBox *checkFill,*checkBorder; +QLabel *labelFont; +QString filename; + +MainWindow::MainWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::MainWindow) +{ + ui->setupUi(this); + QDesktopWidget* desktop = QApplication::desktop(); + move((desktop->width() - this->width())/2, (desktop->height() - this->height())/2); + imageWidget = new ImageWidget; + scrollArea = new QScrollArea; + scrollArea->setWidget(imageWidget); + scrollArea->widget()->setMinimumSize(600,500); + setCentralWidget(scrollArea); + + QStyle* style = QApplication::style(); + QIcon icon = style->standardIcon(QStyle::SP_FileDialogNewFolder); + ui->action_new->setIcon(icon); + icon = style->standardIcon(QStyle::SP_DialogOpenButton); + ui->action_open->setIcon(icon); + icon = style->standardIcon(QStyle::SP_DialogSaveButton); + ui->action_save->setIcon(icon); + icon = style->standardIcon(QStyle::SP_DialogCloseButton); + ui->action_quit->setIcon(icon); + icon = style->standardIcon(QStyle::SP_DialogCancelButton); + ui->action_undo->setIcon(icon); + icon = style->standardIcon(QStyle::SP_DialogCloseButton); + ui->action_quit->setIcon(icon); + icon = style->standardIcon(QStyle::SP_ComputerIcon); + ui->action_setWallpaper->setIcon(icon); + icon = style->standardIcon(QStyle::SP_DialogHelpButton); + ui->action_about->setIcon(icon); + btnColorBorder = new QToolButton(this); + btnColorBorder->setText("□"); + btnColorBorder->setToolTip("边框"); + ui->mainToolBar->addWidget(btnColorBorder); + checkBorder=new QCheckBox(this); + checkBorder->setCheckState(Qt::Checked); + ui->mainToolBar->addWidget(checkBorder); + btnColorFill = new QToolButton(this); + btnColorFill->setText("■"); + btnColorFill->setToolTip("填充"); + ui->mainToolBar->addWidget(btnColorFill); + checkFill=new QCheckBox(this); + ui->mainToolBar->addWidget(checkFill); + spinbox=new QSpinBox(this); + spinbox->setSingleStep(1); + spinbox->setRange(1,50); + spinbox->setValue(1); + ui->mainToolBar->addWidget(spinbox); + labelFont=new QLabel; + ui->actionFont->setText(labelFont->font().family()+","+QString::number(labelFont->font().pointSize())); + lineEdit = new QLineEdit(text,this); + lineEdit->setFixedWidth(60); + ui->mainToolBar->addWidget(lineEdit); + imageWidget->text=text; + connect(ui->action_quit, SIGNAL(triggered()), qApp, SLOT(quit())); + connect(btnColorFill, SIGNAL(clicked()), this, SLOT(setColorFill())); + connect(btnColorBorder, SIGNAL(clicked()), this, SLOT(setColorBorder())); + connect(spinbox, SIGNAL(valueChanged(int)), this, SLOT(onSpinValueChanged(int))); + connect(lineEdit, SIGNAL(textChanged(QString)), this, SLOT(onTextChanged(QString))); + connect(checkBorder, SIGNAL(stateChanged(int)), this, SLOT(checkBorderChanged(int))); + connect(checkFill, SIGNAL(stateChanged(int)), this, SLOT(checkFillChanged(int))); + + QStringList Largs=QApplication::arguments(); + qDebug() << Largs; + if(Largs.length()>1){ + path=Largs.at(1); + open(path); + } +} + +MainWindow::~MainWindow() +{ + delete ui; +} + +void MainWindow::resizeEvent(QResizeEvent *) +{ + //QRect childRect = scrollArea->childrenRect(); + //imageWidget->resize(childRect.size()); +} + +void MainWindow::on_action_changelog_triggered() +{ + QMessageBox aboutMB(QMessageBox::NoIcon, "更新历史", "1.6(2017-05)\n右键打开文件记忆文件路径。\n\n1.5 (2017-04)\n透明色反色不改变。\n增加取色工具,橡皮擦颜色不再固定为白色,而是填充色。\n\n1.4 (2017-03)\n支持命令行打开文件和打开方式打开文件。\n修复鼠标指针引用本地文件,没引用资源文件,引起启动path参数改变不能加载图标的问题。\n菜单的SIGNAL-SLOT改为on_action_triggered()\n修复PNG图片裁剪丢失透明度问题。\n新建图像为透明图像。\n\n1.3 (2017-03)\n实现选区模糊。\n加入模糊滤镜\n\n1.2 (2017-02)\n文件名显示在窗口标题栏。\n区别保存和另存为。\n增加导入图片。\n\n1.1 (2017-01)\n新增灰度、反色。\n\n1.0 (2017-01)\n解决删除选区后画不出选框的问题。\n恢复撤销。\n增加全选。\n实现选区或剪贴板移动!\n保存时自动获取打开文件的路径。\n增加按像素、比例缩放。\n实现在属性窗口设置画布大小。\n2016-12\n增加快捷键控制选框及其边框移动。\n绘图代码从MainWindow向imageWidget迁移。\n实现水平镜像、垂直镜像。\n实现放大、缩小、原始大小。\n为了增加滚动条,增加自定义imageWidget。\n状态栏显示绘图详情。\n复制选区到系统剪贴板,从系统剪贴板获取图像粘贴。\n优化颜色选择交互。\n增加撤销、重做功能,有BUG。\n设为壁纸。\n画选区,剪裁选区。\n新建图片,打开图片,保存图片。\n实现画点、线、框、圆、字。"); + aboutMB.exec(); +} + +void MainWindow::on_action_aboutQt_triggered() +{ + QMessageBox::aboutQt(NULL, "关于 Qt"); +} + +void MainWindow::on_action_about_triggered() +{ + QMessageBox aboutMB(QMessageBox::NoIcon, "关于", "海天鹰画图 1.6\n一款基于Qt的画图程序。\n作者:黄颖\nE-mail: sonichy@163.com\n主页:sonichy.96.lt\n参考文献:\n绘图:\nhttp://tzc.is-programmer.com/posts/534.html\nhttp://lizhigg.love.blog.163.com/blog/static/62611781201222105550184/\n滚动条:http://down.51cto.com/data/233634\n灰度图:http://www.cnblogs.com/xianglan/archive/2010/12/24/1915905.html"); + aboutMB.setIconPixmap(QPixmap(":/icon.png")); + aboutMB.exec(); +} + +void MainWindow::setColorBorder() +{ + QPalette plt = btnColorBorder->palette(); + QBrush brushb = plt.color(QPalette::ButtonText); + QColor color = QColorDialog::getColor(brushb.color(), this); + imageWidget->pen.setColor(color); + plt.setColor(QPalette::ButtonText, color); + btnColorBorder->setPalette(plt); +} + +void MainWindow::setColorFill() +{ + QPalette plt = btnColorFill->palette(); + QBrush brush = plt.color(QPalette::ButtonText); + colorf = QColorDialog::getColor(brush.color(), this); + imageWidget->brush.setColor(colorf); + plt.setColor(QPalette::ButtonText, colorf); + btnColorFill->setPalette(plt); +} + +void MainWindow::onSpinValueChanged(int i) +{ + imageWidget->pen.setWidth(i); + imageWidget->pen.setJoinStyle(Qt::MiterJoin); +} + + +void MainWindow::on_actionPencil_triggered() +{ + imageWidget->drawPoint(); +} + +void MainWindow::on_actionLine_triggered() +{ + imageWidget->drawLine(); +} + +void MainWindow::on_actionRect_triggered() +{ + imageWidget->drawRect(); +} + +void MainWindow::on_actionEllipse_triggered() +{ + imageWidget->drawEllipse(); +} + +void MainWindow::on_actionText_triggered() +{ + imageWidget->drawText(); +} + +void MainWindow::on_actionFill_triggered() +{ + imageWidget->drawFill(); +} + +void MainWindow::on_actionErase_triggered() +{ + imageWidget->drawErase(); +} + +void MainWindow::on_actionMove_triggered() +{ + imageWidget->drawMove(); +} + +void MainWindow::on_actionRectselect_triggered() +{ + imageWidget->drawRectselect(); +} + +void MainWindow::on_action_selectAll_triggered() +{ + imageWidget->selectAll(); +} + +void MainWindow::on_actionCutSelect_triggered() +{ + imageWidget->cutSelect(); +} + +void MainWindow::on_actionColorPicker_triggered() +{ + imageWidget->colorPicker(); +} + +void MainWindow::on_action_delete_triggered() +{ + imageWidget->delSelect(); +} + +void MainWindow::onTextChanged(QString s) +{ + imageWidget->text=s; +} + +void MainWindow::on_action_new_triggered() +{ + imageWidget->newfile(); +} + +void MainWindow::on_action_open_triggered() +{ + if(path==""){ + path = QFileDialog::getOpenFileName(this,"打开图片", ".", "图片文件(*.jpg *.jpeg *.png *.bmp)"); + }else{ + path = QFileDialog::getOpenFileName(this,"打开图片", path, "图片文件(*.jpg *.jpeg *.png *.bmp)"); + } + if(path.length() != 0){ + open(path); + } +} + +void MainWindow::open(QString path) +{ + imageWidget->load(path); + filename=QFileInfo(path).fileName(); + setWindowTitle(filename+" - 海天鹰画图"); + ui->statusBar->showMessage("打开 "+path); +} + +void MainWindow::on_action_import_triggered(){ + QString filenamei=""; + if(path==""){ + filenamei = QFileDialog::getOpenFileName(this,"导入图片", ".", "图片文件(*.jpg *.png *.bmp)"); + }else{ + filenamei = QFileDialog::getOpenFileName(this,"导入图片", path, "图片文件(*.jpg *.png *.bmp)"); + } + ui->statusBar->showMessage("导入 "+filenamei); + if(path.length()!=0){ + imageWidget->image=imageWidget->imgtemp; + QImage imgImport(filenamei); + QApplication::clipboard()->setImage(imgImport, QClipboard::Clipboard); + imageWidget->paste(); + imageWidget->imgmove=imgImport; + //imageWidget->imgtemp=imgImport; + //imageWidget->imgbuf[0]=imgImport; + } +} + +void MainWindow::on_action_save_triggered(){ + qDebug() << "save path=" << path; + if(path.length() != 0){ + ui->statusBar->showMessage("保存 "+path); + imageWidget->image=imageWidget->imgtemp; + imageWidget->save(path); + }else{ + on_action_saveas_triggered(); + } +} + +void MainWindow::on_action_saveas_triggered() +{ + if(path==""){ + path = QFileDialog::getSaveFileName(this,"保存图片","./未命名.jpg","图片文件(*.jpg *.png *.bmp)"); + }else{ + path = QFileDialog::getSaveFileName(this,"保存图片",path,"图片文件(*.jpg *.png *.bmp)"); + } + if(path.length() != 0){ + ui->statusBar->showMessage("保存 "+path); + imageWidget->image=imageWidget->imgtemp; + imageWidget->save(path); + filename=QFileInfo(path).fileName(); + setWindowTitle(filename+" - 海天鹰画图"); + } +} + +void MainWindow::on_actionFont_triggered() +{ + bool ok; + QFont font = QFontDialog::getFont(&ok, labelFont->font(), this, "选择字体"); + if(ok) + { + labelFont->setFont(font); + imageWidget->labelFont->setFont(font); + ui->actionFont->setText(labelFont->font().family()+","+QString::number(labelFont->font().pointSize())); + } +} + +void MainWindow::on_action_undo_triggered() +{ + imageWidget->undo(); +} + +void MainWindow::on_action_redo_triggered() +{ + imageWidget->redo(); +} + +void MainWindow::on_action_setWallpaper_triggered() +{ + QString str="gsettings set org.gnome.desktop.background picture-uri file://"+path; + QByteArray ba = str.toLocal8Bit(); + qDebug() << ba.data(); + system(ba.data()); +} + +void MainWindow::on_action_property_triggered() +{ + //qDebug() << image.width() << "X" << image.height(); + QDialog *dialog=new QDialog(this); + dialog->setWindowTitle("属性"); + QVBoxLayout *vbox=new QVBoxLayout; + QHBoxLayout *hbox=new QHBoxLayout; + QLabel *label=new QLabel("宽度:"); + QSpinBox *spinw=new QSpinBox; + spinw->setRange(0,10000); + spinw->setValue(imageWidget->imgtemp.width()); + hbox->addWidget(label,0,Qt::AlignCenter); + hbox->addWidget(spinw); + vbox->addLayout(hbox); + label=new QLabel("高度:"); + QSpinBox *spinh=new QSpinBox; + spinh->setRange(0,10000); + spinh->setValue(imageWidget->imgtemp.height()); + hbox=new QHBoxLayout; + hbox->addWidget(label,0,Qt::AlignCenter); + hbox->addWidget(spinh); + vbox->addLayout(hbox); + QPushButton *btnConfirm=new QPushButton("确定"); + QPushButton *btnCancel=new QPushButton("取消"); + hbox=new QHBoxLayout; + hbox->addWidget(btnConfirm); + hbox->addWidget(btnCancel); + vbox->addLayout(hbox); + dialog->setLayout(vbox); + connect(btnConfirm, SIGNAL(clicked()), dialog, SLOT(accept())); + connect(btnCancel, SIGNAL(clicked()), dialog, SLOT(reject())); + if(dialog->exec()==QDialog::Accepted){ + imageWidget->newsize(spinw->value(),spinh->value()); + } + dialog->close(); +} + +void MainWindow::on_action_excude_triggered() +{ int wo=imageWidget->imgtemp.width(); + int ho=imageWidget->imgtemp.height(); + QDialog *dialog=new QDialog(this); + dialog->setWindowTitle("缩放"); + + QVBoxLayout *vbox=new QVBoxLayout; + QHBoxLayout *hbox=new QHBoxLayout; + QLabel *label=new QLabel("宽度:"); + spinw=new QSpinBox; + spinw->setRange(1,10000); + spinw->setValue(wo); + hbox->addWidget(label,0,Qt::AlignCenter); + hbox->addWidget(spinw); + label=new QLabel("px"); + hbox->addWidget(label); + spinwr=new QSpinBox; + spinwr->setRange(10,1000); + spinwr->setValue(100); + hbox->addWidget(spinwr); + label=new QLabel("%"); + hbox->addWidget(label); + vbox->addLayout(hbox); + + hbox=new QHBoxLayout; + label=new QLabel("高度:"); + hbox->addWidget(label,0,Qt::AlignCenter); + spinh=new QSpinBox; + spinh->setRange(1,10000); + spinh->setValue(ho); + hbox->addWidget(spinh); + label=new QLabel("px"); + hbox->addWidget(label); + spinhr=new QSpinBox; + spinhr->setRange(10,1000); + spinhr->setValue(100); + hbox->addWidget(spinhr); + label=new QLabel("%"); + hbox->addWidget(label); + vbox->addLayout(hbox); + + QPushButton *btnConfirm=new QPushButton("确定"); + QPushButton *btnCancel=new QPushButton("取消"); + hbox=new QHBoxLayout; + hbox->addStretch(); + hbox->addWidget(btnConfirm); + hbox->addWidget(btnCancel); + hbox->addStretch(); + vbox->addLayout(hbox); + dialog->setLayout(vbox); + + connect(spinw, SIGNAL(valueChanged(int)), this, SLOT(onSpinwChanged(int))); + connect(spinh, SIGNAL(valueChanged(int)), this, SLOT(onSpinhChanged(int))); + connect(spinwr, SIGNAL(valueChanged(int)), this, SLOT(onSpinwrChanged(int))); + connect(spinhr, SIGNAL(valueChanged(int)), this, SLOT(onSpinhrChanged(int))); + connect(btnConfirm, SIGNAL(clicked()), dialog, SLOT(accept())); + connect(btnCancel, SIGNAL(clicked()), dialog, SLOT(reject())); + if(dialog->exec()==QDialog::Accepted){ + imageWidget->scale(spinw->value(),spinh->value()); + } + dialog->close(); +} + +void MainWindow::onSpinwChanged(int i) +{ + disconnect(spinwr, SIGNAL(valueChanged(int)), this, SLOT(onSpinwrChanged(int))); + spinwr->setValue(i*100/imageWidget->image.width()); + connect(spinwr, SIGNAL(valueChanged(int)), this, SLOT(onSpinwrChanged(int))); +} + +void MainWindow::onSpinhChanged(int i) +{ + disconnect(spinhr, SIGNAL(valueChanged(int)), this, SLOT(onSpinhrChanged(int))); + spinhr->setValue(i*100/imageWidget->image.height()); + connect(spinhr, SIGNAL(valueChanged(int)), this, SLOT(onSpinhrChanged(int))); +} + +void MainWindow::onSpinwrChanged(int i) +{ + disconnect(spinw, SIGNAL(valueChanged(int)), this, SLOT(onSpinwChanged(int))); + spinw->setValue(imageWidget->image.width()*i/100); + connect(spinw, SIGNAL(valueChanged(int)), this, SLOT(onSpinwChanged(int))); +} + +void MainWindow::onSpinhrChanged(int i) +{ + disconnect(spinh, SIGNAL(valueChanged(int)), this, SLOT(onSpinhChanged(int))); + spinh->setValue(imageWidget->image.height()*i/100); + connect(spinh, SIGNAL(valueChanged(int)), this, SLOT(onSpinhChanged(int))); +} + +void MainWindow::on_action_copy_triggered() +{ + if(imageWidget->draw_type==imageWidget->SELECT_DRAW){ + imageWidget->copy(); + ui->statusBar->showMessage("选区已复制到剪贴板"); + } +} + +void MainWindow::on_action_paste_triggered() +{ + imageWidget->paste(); + ui->statusBar->showMessage("剪贴板已粘贴"); +} + +void MainWindow::on_actionZoomin_triggered() +{ + imageWidget->zoomin(); +} + +void MainWindow::on_actionZoomout_triggered() +{ + imageWidget->zoomout(); +} + +void MainWindow::on_actionZoom1_triggered() +{ + imageWidget->zoom1(); +} + +void MainWindow::on_actionRotateLeft_triggered() +{ + imageWidget->rotate(-90); +} + +void MainWindow::on_actionRotateRight_triggered() +{ + imageWidget->rotate(90); +} + +void MainWindow::on_actionMirrorHorizontal_triggered() +{ + imageWidget->mirror(true,false); +} + +void MainWindow::on_actionMirrorVertical_triggered() +{ + imageWidget->mirror(false,true); +} + +void MainWindow::on_action_help_triggered() +{ + QMessageBox MBHelp(QMessageBox::NoIcon, "帮助", "选区上移\tAlt + ↑\n选区下移\tAlt + ↓\n选区左移\tAlt + ←\n选区右移\tAlt + →\n选区上边上移\tCtrl + ↑\n选区上边下移\tCtrl + ↓\n选区左边左移\tCtrl + ←\n选区左边右移\tCtrl + →\n选区下边上移\tShift + ↑\n选区下边下移\tShift + ↓\n选区右边左移\tShift + ←\n选区右边右移\tShift + →"); + MBHelp.exec(); +} + +void MainWindow::checkBorderChanged(int state) +{ + if (state == Qt::Checked) // "选中" + { + imageWidget->boolBorder=true; + } + else if(state == Qt::PartiallyChecked) // "半选" + { + + } + else // 未选中 - Qt::Unchecked + { + imageWidget->boolBorder=false; + } +} + +void MainWindow::checkFillChanged(int state) +{ + if (state == Qt::Checked) // "选中" + { + imageWidget->boolFill=true; + } + else if(state == Qt::PartiallyChecked) // "半选" + { + + } + else // 未选中 - Qt::Unchecked + { + imageWidget->boolFill=false; + } +} + +void MainWindow::on_action_gray_triggered() +{ + imageWidget->gray(); +} + +void MainWindow::on_action_invert_triggered() +{ + imageWidget->invert(); +} + +void MainWindow::on_action_blur_triggered() +{ + imageWidget->blur(spinbox->value()); +} diff --git a/mainwindow.h b/mainwindow.h new file mode 100644 index 0000000..102a241 --- /dev/null +++ b/mainwindow.h @@ -0,0 +1,85 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include +#include +#include +using namespace std; +namespace Ui { + class MainWindow; +} + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit MainWindow(QWidget *parent = 0); + ~MainWindow(); + Ui::MainWindow *ui; + +protected: + void resizeEvent(QResizeEvent *); + +private: + QScrollArea *scrollArea; + ImageWidget *imageWidget; + +private slots: + void on_action_new_triggered(); + void on_action_open_triggered(); + void on_action_changelog_triggered(); + void on_action_aboutQt_triggered(); + void on_action_about_triggered(); + void on_action_selectAll_triggered(); + void on_action_delete_triggered(); + void on_action_undo_triggered(); + void on_action_redo_triggered(); + void on_action_copy_triggered(); + void on_action_paste_triggered(); + void on_action_setWallpaper_triggered(); + void on_action_property_triggered(); + void on_action_help_triggered(); + void on_action_excude_triggered(); + void on_action_gray_triggered(); + void on_action_invert_triggered(); + void on_action_save_triggered(); + void on_action_saveas_triggered(); + void on_action_import_triggered(); + void on_action_blur_triggered(); + + void on_actionPencil_triggered(); + void on_actionLine_triggered(); + void on_actionRect_triggered(); + void on_actionEllipse_triggered(); + void on_actionText_triggered(); + void on_actionFill_triggered(); + void on_actionErase_triggered(); + void on_actionMove_triggered(); + void on_actionRectselect_triggered(); + void on_actionCutSelect_triggered(); + void on_actionRotateLeft_triggered(); + void on_actionRotateRight_triggered(); + void on_actionMirrorHorizontal_triggered(); + void on_actionMirrorVertical_triggered(); + void on_actionZoomin_triggered(); + void on_actionZoomout_triggered(); + void on_actionZoom1_triggered(); + void on_actionFont_triggered(); + void on_actionColorPicker_triggered(); + + void setColorFill(); + void setColorBorder(); + void onSpinValueChanged(int i); + void onTextChanged(QString text); + void onSpinwChanged(int i); + void onSpinhChanged(int i); + void onSpinwrChanged(int i); + void onSpinhrChanged(int i); + void checkBorderChanged(int state); + void checkFillChanged(int state); + void open(QString path); +}; + +#endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui new file mode 100644 index 0000000..ddae8cc --- /dev/null +++ b/mainwindow.ui @@ -0,0 +1,549 @@ + + + MainWindow + + + + 0 + 0 + 1000 + 600 + + + + 海天鹰画图 + + + + :/icon.png:/icon.png + + + + + + 0 + 0 + 1000 + 24 + + + + + 文件 + + + + + + + + + + + 编辑 + + + + + + + + + + + + 图像 + + + + + + + + + + + + 帮助 + + + + + + + + + + + + + + TopToolBarArea + + + false + + + + + + + + + + + + + + + + + + + + + + + + + 打开 + + + Ctrl+O + + + + + 保存 + + + Ctrl+S + + + + + 另存为 + + + + + 退出 + + + Ctrl+Q + + + + + 撤销 + + + Ctrl+Z + + + + + 重做 + + + Ctrl+Y + + + + + 复制 + + + Ctrl+C + + + + + 剪切 + + + Ctrl+X + + + + + 粘贴 + + + Ctrl+V + + + + + 全选 + + + Ctrl+A + + + + + 删除 + + + Del + + + + + 翻转/旋转 + + + 翻转/旋转 + + + Ctrl+R + + + + + 拉伸/扭曲 + + + 拉伸/扭曲 + + + Ctrl+W + + + + + 属性 + + + Ctrl+E + + + + + 设为壁纸 + + + + + 帮助 + + + F1 + + + + + 更新日志 + + + + + 关于 + + + + + 新建 + + + Ctrl+N + + + + + false + + + false + + + true + + + + :/pencil.png:/pencil.png + + + 铅笔 + + + 铅笔 + + + + + + :/line.png:/line.png + + + 直线 + + + 直线 + + + + + + :/ellipse.png:/ellipse.png + + + 椭圆 + + + 椭圆 + + + + + + :/rect.png:/rect.png + + + 矩形 + + + 矩形 + + + + + + :/text.png:/text.png + + + 文本 + + + 文本 + + + + + + :/eraser.png:/eraser.png + + + 擦子 + + + 擦子 + + + + + + :/move.png:/move.png + + + move + + + 移动 + + + + + + :/rectselect.png:/rectselect.png + + + rectselect + + + 框选 + + + + + false + + + false + + + + + + 填充 + + + + 13 + + + + + + + + + 边框 + + + + 13 + + + + + + 字体 + + + 字体 + + + + + + :/clip.png:/clip.png + + + 剪切选区 + + + 剪切选区 + + + + + + :/fill.png:/fill.png + + + Fill + + + 填充 + + + + + 关于Qt + + + + + + :/zoomin.png:/zoomin.png + + + + + + + 放大 + + + + + + :/zoomout.png:/zoomout.png + + + - + + + 缩小 + + + + + + :/zoom1.png:/zoom1.png + + + 1 + + + 实际大小 + + + + + + :/rr.png:/rr.png + + + rotateRight + + + 右转90° + + + + + + :/rl.png:/rl.png + + + RotateLeft + + + 左转90° + + + + + + :/MirrorHorizontal.png:/MirrorHorizontal.png + + + MirrorHorizontal + + + 水平镜像 + + + + + + :/MirrorVertical.png:/MirrorVertical.png + + + MirrorVertical + + + 垂直镜像 + + + + + 灰度 + + + + + 反色 + + + + + 导入图片 + + + + + 模糊 + + + + + + :/color_picker.png:/color_picker.png + + + 颜色拾取 + + + 颜色拾取 + + + + + + + + + diff --git a/move.png b/move.png new file mode 100644 index 0000000..ae4201b Binary files /dev/null and b/move.png differ diff --git a/pencil.png b/pencil.png new file mode 100644 index 0000000..f627567 Binary files /dev/null and b/pencil.png differ diff --git a/preview.png b/preview.png new file mode 100644 index 0000000..4100897 Binary files /dev/null and b/preview.png differ diff --git a/rect.png b/rect.png new file mode 100644 index 0000000..22b485f Binary files /dev/null and b/rect.png differ diff --git a/rectselect.png b/rectselect.png new file mode 100644 index 0000000..3268b02 Binary files /dev/null and b/rectselect.png differ diff --git a/rl.png b/rl.png new file mode 100644 index 0000000..78ca97f Binary files /dev/null and b/rl.png differ diff --git a/rr.png b/rr.png new file mode 100644 index 0000000..80c6f03 Binary files /dev/null and b/rr.png differ diff --git a/text.png b/text.png new file mode 100644 index 0000000..740656a Binary files /dev/null and b/text.png differ diff --git a/zoom1.png b/zoom1.png new file mode 100644 index 0000000..861965f Binary files /dev/null and b/zoom1.png differ diff --git a/zoomin.png b/zoomin.png new file mode 100644 index 0000000..a6f62e3 Binary files /dev/null and b/zoomin.png differ diff --git a/zoomout.png b/zoomout.png new file mode 100644 index 0000000..1eeba25 Binary files /dev/null and b/zoomout.png differ