Qt图形库——Qt画图板
来源:互联网 发布:货物存储软件 编辑:程序博客网 时间:2024/05/16 01:42
Qt图形库——Qt画图板
完整代码:
//mainwindows.h
#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QColorDialog>#include <QInputDialog>#include <QActionGroup>#include <QFileDialog>#include <QMainWindow>#include <QKeyEvent>#include <QToolBar>#include <QMenuBar>#include <QSlider>#include <QAction>#include <QColor>#include <QLabel>#include <QMenu>#include <QDial>#include "paint.h"#include "type.h"class MainWindow : public QMainWindow{ Q_OBJECTpublic: MainWindow(QWidget *parent = 0); ~MainWindow(); void keyPressEvent(QKeyEvent *); //键盘事件 void keyReleaseEvent(QKeyEvent *); //键盘事件signals: void openFile_SIGNAL(QString); void saveFile_SIGNAL(QString); //文件操作信号 void change_straight(bool); //改变是否笔直绘画的信号 void color_change(QColor); ///属性调整信号 void brush_change(QColor); void width_change(int); //设置线条粗细的信号 void alpha_change(int); //设置透明度的信号 void select_shape(type); //选择形状信号private slots: void change_widthLabel(int); ///改变属性的槽 void change_alphaLabel(int); void color_SLOT(); void brush_SLOT(); void width_SLOT(); void draw_rect(); ///绘制槽 void draw_line(); void draw_pen(); void draw_polygon(); void draw_ellipse(); void reset_dial(); //重置面板private: QLabel *widthLabel; //显示当前线条大小 QDial *widthDial; QLabel *alphaLabel; //显示当前透明度 QDial *alphaDial; virtual QSize sizeHint() const override; //调整窗体的函数};#endif // MAINWINDOW_H<qcolordialog><qinputdialog><qactiongroup><qfiledialog><qmainwindow><qkeyevent><qtoolbar><qmenubar><qslider><qaction><qcolor><qlabel><qmenu><qdial></qdial></qmenu></qlabel></qcolor></qaction></qslider></qmenubar></qtoolbar></qkeyevent></qmainwindow></qfiledialog></qactiongroup></qinputdialog></qcolordialog>
//mainWindow.cpp
#include "mainwindow.h"MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){ ///////形状选择框架/////// QToolBar *shapeBar = this->addToolBar("Shape"); QActionGroup *shapeGroup = new QActionGroup(shapeBar); QAction *act_rect = new QAction(QIcon(":res/Rect.ico"),"Draw a Rect", shapeBar); act_rect->setCheckable(true); act_rect->setChecked(true); shapeGroup->addAction(act_rect); shapeBar->addAction(act_rect); QAction *act_line = new QAction(QIcon(":res/Line.ico"),"Draw A Line", shapeBar); act_line->setCheckable(true); shapeGroup->addAction(act_line); shapeBar->addAction(act_line); QAction *act_pen = new QAction(QIcon(":res/pen.ico"), "Draw With Pen", shapeBar); act_pen->setCheckable(true); shapeGroup->addAction(act_pen); shapeBar->addAction(act_pen); QAction *act_ellipse = new QAction(QIcon(":res/Ellipse.ico"), "Draw A Ellipse", shapeBar); act_ellipse->setCheckable(true); shapeGroup->addAction(act_ellipse); shapeBar->addAction(act_ellipse); QAction *act_polygon = new QAction(QIcon(":res/Polygon.ico"), "Draw A Polygon", shapeBar); act_polygon->setCheckable(true); shapeGroup->addAction(act_polygon); shapeBar->addAction(act_polygon); ////////操作选择框架///////////// QToolBar *operatorBar = this->addToolBar("Operator"); QActionGroup *operatorGroup = new QActionGroup(operatorBar); QAction *Undo = new QAction(QIcon(":/res/Undo.ico"), "Undo", operatorBar); Undo->setShortcut(tr("Ctrl+Z")); operatorGroup->addAction(Undo); operatorBar->addAction(Undo); QAction *Redo = new QAction(QIcon(":/res/Redo.ico"), "Redo", operatorBar); Redo->setShortcut(tr("Ctrl+Y")); operatorGroup->addAction(Redo); operatorBar->addAction(Redo); QAction *Reset = new QAction(QIcon(":/res/Reset.ico"), "Reset", operatorBar); Reset->setShortcut(tr("Ctrl+N")); operatorGroup->addAction(Reset); operatorBar->addAction(Reset); widthDial = new QDial(operatorBar); widthDial->setRange(1, 20); operatorBar->addWidget(widthDial); widthLabel = new QLabel("Size: 1", operatorBar); operatorBar->addWidget(widthLabel); alphaDial = new QDial(operatorBar); alphaDial->setRange(0, 100); alphaDial->setValue(100); operatorBar->addWidget(alphaDial); alphaLabel = new QLabel("Alpha: 100%", operatorBar); operatorBar->addWidget(alphaLabel); ////////////菜单区域//////////////// QMenu *file = menuBar()->addMenu(tr("&File")); QAction *newFile = new QAction(QIcon(":/res/New.ico"),tr("New"), file); newFile->setShortcut(tr("Ctrl+N")); file->addAction(newFile); QAction *openFile = new QAction(QIcon(":/res/open.ico"),tr("Open"), file); openFile->setShortcut(tr("Ctrl+O")); file->addAction(openFile); QAction *saveFile = new QAction(QIcon(":/res/Save.ico"),tr("Save"), file); saveFile->setShortcut(tr("Ctrl+S")); file->addAction(saveFile); QAction *saveAsFile = new QAction(QIcon(":/res/SaveAs.ico"),tr("Save As"), file); saveAsFile->setShortcut(tr("Ctrl+Alt+S")); file->addAction(saveAsFile); QAction *quit = new QAction(QIcon(":/res/Quit.ico"),tr("Quit"), file); quit->setShortcut(tr("Ctrl+Q")); file->addAction(quit); QMenu *change = menuBar()->addMenu(tr("&Change")); QAction *changeColor = new QAction(QIcon(":/res/Color.ico"),tr("Color"), change); changeColor->setShortcut(tr("Ctrl+C")); change->addAction(changeColor); QAction *changeBrush = new QAction(QIcon(":/res/Brush.ico"),tr("Brush"), change); changeBrush->setShortcut(tr("Ctrl+B")); change->addAction(changeBrush); QAction *changeWidth = new QAction(QIcon(":/res/Width.ico"),tr("Width"), change); changeWidth->setShortcut(tr("Ctrl+W")); change->addAction(changeWidth); ////////////paint定义//////////// Paint *paint = new Paint(this); setCentralWidget(paint); ////////工具栏信号槽////////////////// QObject::connect(act_rect, SIGNAL(triggered()), this, SLOT(draw_rect())); QObject::connect(act_line, SIGNAL(triggered()), this, SLOT(draw_line())); QObject::connect(act_pen, SIGNAL(triggered()), this, SLOT(draw_pen())); QObject::connect(act_polygon, SIGNAL(triggered()), this, SLOT(draw_polygon())); QObject::connect(act_ellipse, SIGNAL(triggered()), this, SLOT(draw_ellipse())); QObject::connect(Undo, SIGNAL(triggered()), paint, SLOT(Undo())); QObject::connect(Redo, SIGNAL(triggered()), paint, SLOT(Redo())); QObject::connect(Reset, SIGNAL(triggered()), paint, SLOT(Reset())); QObject::connect(Reset, SIGNAL(triggered()), this, SLOT(reset_dial())); QObject::connect(widthDial, SIGNAL(valueChanged(int)), paint, SLOT(set_width(int))); QObject::connect(widthDial, SIGNAL(valueChanged(int)), this, SLOT(change_widthLabel(int))); QObject::connect(alphaDial, SIGNAL(valueChanged(int)), paint, SLOT(set_alpha(int))); QObject::connect(alphaDial, SIGNAL(valueChanged(int)), this, SLOT(change_alphaLabel(int))); ////////菜单栏信号槽////////////////// QObject::connect(newFile, SIGNAL(triggered()), paint, SLOT(Reset())); QObject::connect(openFile, SIGNAL(triggered()), paint, SLOT(open_file())); QObject::connect(saveFile, SIGNAL(triggered()), paint, SLOT(save_file())); QObject::connect(saveAsFile, SIGNAL(triggered()), paint, SLOT(saveAs_file())); QObject::connect(quit, SIGNAL(triggered()),this, SLOT(close())); QObject::connect(changeColor, SIGNAL(triggered()), this, SLOT(color_SLOT())); QObject::connect(changeBrush, SIGNAL(triggered()), this, SLOT(brush_SLOT())); QObject::connect(changeWidth, SIGNAL(triggered()), this, SLOT(width_SLOT())); /////////Paint交互信号槽/////////////////// QObject::connect(this, SIGNAL(select_shape(type)), paint, SLOT(set_shape(type))); QObject::connect(this, SIGNAL(color_change(QColor)), paint, SLOT(set_color(QColor))); QObject::connect(this, SIGNAL(brush_change(QColor)), paint, SLOT(set_brush(QColor))); QObject::connect(this, SIGNAL(width_change(int)), paint, SLOT(set_width(int))); QObject::connect(this, SIGNAL(change_straight(bool)), paint, SLOT(set_straight(bool)));}///////信息发射///////////////void MainWindow::keyPressEvent(QKeyEvent *k){ if (k->modifiers() == Qt::ShiftModifier) { emit change_straight(true); }}void MainWindow::keyReleaseEvent(QKeyEvent *k){ if (k->key() == Qt::Key_Shift) { emit change_straight(false); }}void MainWindow::color_SLOT(){ QColor c = QColorDialog::getColor(Qt::black); emit color_change(c);}void MainWindow::brush_SLOT(){ QColor c = QColorDialog::getColor(Qt::transparent); emit brush_change(c);}void MainWindow::width_SLOT(){ int c = QInputDialog::getInt(this, tr("Width Set"), tr("Enter the Width"), true, 1, 20, 1); emit width_change(c);}void MainWindow::draw_rect(){ emit select_shape(type_Rect);}void MainWindow::draw_line(){ emit select_shape(type_Line);}void MainWindow::draw_pen(){ emit select_shape(type_Pen);}void MainWindow::draw_polygon(){ emit select_shape(type_Polygon);}void MainWindow::draw_ellipse(){ emit select_shape(type_Ellipse);}///////////////////槽函数////////////////void MainWindow::change_widthLabel(int w){ widthLabel->setText("Size: " + QString::number(w));}void MainWindow::change_alphaLabel(int w){ alphaLabel->setText("Alpha: " + QString::number(w) + "%");}void MainWindow::reset_dial(){ widthDial->setValue(1); alphaDial->setValue(100); widthLabel->setText("Size: 1"); alphaLabel->setText("Alpha: 100%");}//////////其他//////////MainWindow::~MainWindow(){}QSize MainWindow::sizeHint() const{ return QSize(1024, 768);}
//paint.h
#ifndef PAINT_H#define PAINT_H#include <QTextStream>#include <QFileDialog>#include <QMessageBox>#include <QMouseEvent>#include <QKeyEvent>#include <QWidget>#include <QBrush>#include <QStack>#include <QFile>#include <QPen>#include "ellipse.h"#include "polygon.h"#include "shape.h"#include "type.h"#include "line.h"#include "rect.h"#include "pen.h"class Paint : public QWidget{ Q_OBJECTpublic: explicit Paint(QWidget *parent = 0);protected: void paintEvent(QPaintEvent *); void mouseMoveEvent(QMouseEvent *); void mousePressEvent(QMouseEvent *); void mouseReleaseEvent(QMouseEvent *);public slots: void set_shape(type); void set_color(QColor); void set_brush(QColor); void set_width(int); void set_alpha(int); void set_straight(bool); void open_file(); void save_file(); void saveAs_file(); void Undo(); void Redo(); void Reset();private: type shapeType; QStack<Shape *>stack; QStack<Shape *>redoStack; //撤销恢复用 Shape *shape; QColor currentColor; QColor currentBrush; QString currentPath; int currentWidth; bool stop_polygon; bool is_straight;};#endif // PAINT_H
//paint.cpp
#include "paint.h"Paint::Paint(QWidget *parent) :QWidget(parent), shape(nullptr), shapeType(type_Rect){ currentBrush = Qt::transparent; currentColor = Qt::black; currentWidth = 1; stop_polygon = true; is_straight = false; setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);}void Paint::paintEvent(QPaintEvent *){ QPainter paint(this); paint.setBrush(Qt::white); paint.setPen(Qt::white); //绘制画板区域 paint.drawRect(0, 0, size().width(), size().height()); foreach(Shape *shape, stack) { shape->paint(paint); }}void Paint::mousePressEvent(QMouseEvent *e){ while(!redoStack.empty()) { Shape *tmp = redoStack.top(); redoStack.pop(); delete tmp; } ////////////Polygon特殊处理///////////////// if(e->button() == Qt::RightButton) { stop_polygon = true; return; } if (shapeType == type_Polygon) { if(stop_polygon == true || stack.isEmpty()) { shape = new Polygon; Polygon *tmp = dynamic_cast<Polygon *>(shape); QPoint *p = new QPoint(e->pos()); tmp->push(p); QPoint *p2 = new QPoint(e->pos() + QPoint(0, 1)); tmp->push(p2); stack.push(shape); shape->set(currentColor, currentBrush, currentWidth); stop_polygon = false; } else { if (typeid(*stack.top()) != typeid(Polygon)) { stop_polygon = true; return; } QPoint *p = new QPoint(e->pos()); dynamic_cast<Polygon *>(shape)->push(p); } update(); return; } stop_polygon = true; switch(shapeType) { case type_Line: shape = new Line; break; case type_Rect: shape = new Rect; break; case type_Pen: shape = new Pen; break; case type_Ellipse: shape = new Ellipse; break; } if(shape != NULL) { if (shapeType == type_Pen) { Shape *zero = new Pen; zero->set_start(QPoint(0, 0)); zero->set_end(QPoint(0, 0)); stack.push(zero); }//Pen 制造间隔点 shape->set(currentColor, currentBrush, currentWidth); shape->set_pos(e->pos(), e->pos() + QPoint(0, 1), is_straight); stack.push(shape); } update();}void Paint::mouseMoveEvent(QMouseEvent *e){ ////////////Polygon特殊处理///////////////// if (shapeType == type_Polygon) { Polygon *tmp = dynamic_cast<Polygon *>(stack.top()); QPoint *p = tmp->top(); p->setX(e->x()); p->setY(e->y()); update(); return; } shape->set_pos(shape->get_start(), e->pos(), is_straight); ////////////Pen特殊处理///////////////// if (shapeType == type_Pen) { shape = new Line; shape->set(currentColor, currentBrush, currentWidth); stack.push(shape); shape->set_start(e->pos()); shape->set_end(e->pos()); } update();}void Paint::mouseReleaseEvent(QMouseEvent *){ ////////////Pen特殊处理///////////////// if (shapeType== type_Pen) { Shape *zero = new Pen; zero->set_start(QPoint(0, 0)); zero->set_end(QPoint(0, 0)); stack.push(zero); }//制造间隔点}void Paint::set_straight(bool c){ is_straight = c;}///////////////////SLOT/////////////void Paint::set_color(QColor c){ currentColor = c;}void Paint::set_brush(QColor c){ int tmp; int a; currentBrush.getRgb(&tmp, &tmp, &tmp, &a); currentBrush = c; currentBrush.setAlpha(a);}void Paint::set_shape(type new_shape){ shapeType = new_shape;}void Paint::set_width(int w){ currentWidth = w;}void Paint::set_alpha(int a){ currentBrush.setAlpha((100 - a) * 255 / 100);}////撤销void Paint::Undo(){ if (!stack.empty()) { if(typeid(*stack.top()) == typeid(Pen))//运行期类型识别 { redoStack.push(stack.top()); stack.pop(); while(1) //寻找临界点 { if (stack.top()->get_start() == QPoint(0, 0) && stack.top()->get_end() == QPoint(0, 0)) break; redoStack.push(stack.top()); stack.pop(); } redoStack.push(stack.top()); //加入临界点 stack.pop(); } else { Shape *tmp = stack.top(); stack.pop(); redoStack.push(tmp); } } update();}///恢复void Paint::Redo(){ if (!redoStack.empty()) { if(typeid(*redoStack.top()) == typeid(Pen))//运行期类型识别 { stack.push(redoStack.top()); redoStack.pop(); while(1) //寻找临界点 { if (redoStack.top()->get_start() == QPoint(0, 0) && redoStack.top()->get_end() == QPoint(0, 0)) break; stack.push(redoStack.top()); redoStack.pop(); } stack.push(redoStack.top()); //加入临界点 redoStack.pop(); } else { Shape *tmp = redoStack.top(); redoStack.pop(); stack.push(tmp); } } update();}void Paint::Reset(){ currentBrush = Qt::transparent; currentColor = Qt::black; currentWidth = 1; stack.clear(); redoStack.clear(); stop_polygon = true; update();}void Paint::open_file(){ QString s = QFileDialog::getOpenFileName(this, "Select A File", "/", "Paint File(*.paint)"); if (s.isEmpty()) { QMessageBox::information(this, tr("INformation"), tr("Open failed!")); return; } int st = 0; int x1, y1, x2, y2; int r1, r2, g1, g2, b1, b2, a1, a2; int width; Reset(); currentPath = s; QFile file(currentPath); if (file.open(QFile::ReadOnly)) { QTextStream cin(&file); while(!cin.atEnd()) { st = 0; cin >>st; Shape *tmp; if (st == 0) break; //每次都会莫名其妙多读一行,,What A Fhuack if (st == 5) { tmp = new Polygon; int size; cin >> size; for(int i = 0; i < size; ++i) { cin >> x1 >> y1; QPoint *p = new QPoint(x1, y1); dynamic_cast<Polygon*>(tmp)->push(p); } cin >> r1>>g1>>b1>>a1>>r2>>g2>>b2>>a2>>width; tmp->set(QColor(r1, g1, b1, a1), QColor(r2, g2, b2, a2), width); stack.push(tmp); continue; } else cin >>x1>>y1>>x2>>y2>>r1>>g1>>b1>>a1>>r2>>g2>>b2>>a2>>width; switch(st) { case 1: tmp = new Rect; break; case 2: tmp = new Line; break; case 3: tmp = new Pen; break; case 4: tmp = new Ellipse; } tmp->set_start(QPoint(x1, y1)); tmp->set_end(QPoint(x2, y2)); tmp->set(QColor(r1, g1, b1, a1), QColor(r2, g2, b2, a2), width); stack.push(tmp); } } file.close(); update();}void Paint::save_file(){ if (stack.empty()) { QMessageBox::information(this, tr("Information"), tr("Nothing To Be Save!")); return; } if (currentPath.isEmpty()) { QString s = QFileDialog::getSaveFileName(this, "Select A File", "/", "Paint File(*.paint)"); currentPath = s; } else { QMessageBox::information(this, tr("Information"), tr("Save Successful!")); } int r1, r2, g1, g2, b1, b2, a1, a2; QFile file(currentPath); if (file.open(QFile::WriteOnly)) { QTextStream cout(&file); foreach(Shape *shape, stack) { if (shape->get_typeid() == 5) { cout << "5 "; Polygon *p = dynamic_cast<Polygon*>(shape); cout << p->get_size() << " "; for(int i = 0; i < p->get_size(); ++i) cout << p->index(i)->rx() << " " << p->index(i)->ry() << " "; } else { cout << shape->get_typeid() << " " << shape->get_start().rx() << " " << shape->get_start().ry() << " " << shape->get_end().rx() << " " << shape->get_end().ry() << " "; } shape->get_color().getRgb(&r1, &g1, &b1, &a1); shape->get_brush().getRgb(&r2, &g2, &b2, &a2); cout <<r1<<" "<<g1<<" "<<b1<<" "<<a1<<" " <<r2<<" "<<g2<<" "<<b2<<" "<<a2<<" " << shape->get_width() << endl; } } file.close();}void Paint::saveAs_file(){ if (stack.empty()) { QMessageBox::information(this, tr("Information"), tr("Nothing To Be Save!")); return; } else { QString s = QFileDialog::getSaveFileName(this, "Select A File", "/", "Paint File(*.paint)"); currentPath = s; } save_file();}
//shape.h
#ifndef SHAPE_H#define SHAPE_H#include <QPoint>#include <QPainter>#include <QColor>class Shape{public: Shape(); void set_start(QPoint p); void set_end(QPoint p); void set_pos(QPoint, QPoint, bool); void set(QColor, QColor, int); QPoint get_start(); QPoint get_end(); QColor get_color(); QColor get_brush(); int get_width(); virtual void paint(QPainter& painter) = 0; virtual int get_typeid() = 0;protected: QPoint start; QPoint end; QColor color; QColor brush; int width;};#endif // SHAPE_H
//shape.cpp
#include "shape.h"Shape::Shape() :start(QPoint(0, 0)), end(QPoint(0, 0)){ ;}void Shape::set_end(QPoint p){ end = p;}void Shape::set_start(QPoint p){ start = p;}void Shape::set_pos(QPoint p1, QPoint p2, bool is_straight){ start = p1; int dis; if (is_straight) { if (abs(p1.rx() - p2.rx()) < abs(p1.ry() - p2.ry())) dis = abs(p1.rx() - p2.rx()); else dis = abs(p1.ry() - p2.ry()); if (p1.rx() - p2.rx() > 0) p2.setX(p1.rx() - dis); else p2.setX(p1.rx() + dis); if(p1.ry() - p2.ry() > 0) p2.setY(p1.ry() - dis); else p2.setY(p1.ry() + dis); } end = p2;}QPoint Shape::get_end(){ return end;}QPoint Shape::get_start(){ return start;}QColor Shape::get_color(){ return color;}QColor Shape::get_brush(){ return brush;}int Shape::get_width(){ return width;}void Shape::set(QColor c1, QColor c2, int w){ color = c1; brush = c2; width = w;}
//rect.h
#ifndef RECT_H#define RECT_H#include "shape.h"#include <QPainter>class Rect : public Shape{public: Rect();private: virtual void paint(QPainter& paint) override; virtual int get_typeid() override;};#endif // RECT_H
//rect.cpp
#include "rect.h"Rect::Rect(){}void Rect::paint(QPainter &paint){ paint.setPen(QPen(color, width)); paint.setBrush(brush); paint.drawRect(start.x(), start.y(),end.x() - start.x(), end.y() - start.y());}int Rect::get_typeid(){ return 1;}
//line.h
#ifndef LINE_H#define LINE_H#include <QPainter>#include "shape.h"class Line : public Shape{public: Line();private: virtual void paint(QPainter& paint) override; virtual int get_typeid() override;};#endif // LINE_H
//line.cpp
#include "line.h"Line::Line(){}void Line::paint(QPainter &paint){ paint.setPen(QPen(color, width)); paint.setBrush(brush); paint.drawLine(start, end);}int Line::get_typeid(){ return 2;}
//pen.h
#ifndef PEN_H#define PEN_H#include "shape.h"#include <QPainter>class Pen : public Shape{public: Pen(); virtual void paint(QPainter& paint) override; virtual int get_typeid() override;};#endif // PEN_H
//pen.cpp
#include "pen.h"Pen::Pen(){ ;}void Pen::paint(QPainter &paint){ paint.setPen(QPen(color, width)); paint.setBrush(brush); paint.drawLine(start, end);}int Pen::get_typeid(){ return 3;}
//ellipse.h
#ifndef CIRCLE_H#define CIRCLE_H#include "shape.h"class Ellipse : public Shape{public: Ellipse();private: virtual void paint(QPainter& paint) override; virtual int get_typeid() override;};#endif // CIRCLE_H
//ellipse.cpp
#include "ellipse.h"Ellipse::Ellipse(){}void Ellipse::paint(QPainter &paint){ paint.setPen(QPen(color, width)); paint.setBrush(brush); paint.drawEllipse(start, end.rx() - start.rx(), end.ry() - start.ry());}int Ellipse::get_typeid(){ return 4;}
//polygon.h
#ifndef POLYGON_H#define POLYGON_H#include "shape.h"#include <QPolygon>#include <QPoint>#include <QVector>class Polygon : public Shape{public: Polygon(); ~Polygon(); virtual void paint(QPainter&); virtual int get_typeid(); void push(QPoint *); QPoint *top(); int get_size(); QPoint *index(int pos);private: QVector<QPoint *>polygonStack;};#endif // POLYGON_H
//polygon.cpp
#include "polygon.h"Polygon::Polygon(){}void Polygon::paint(QPainter &paint){ paint.setPen(QPen(color, width)); paint.setBrush(brush); QPolygon polygon(polygonStack.size()); for(int i = 0; i < polygonStack.size(); ++i) { polygon.setPoint(i, *polygonStack[i]); } paint.drawPolygon(polygon);}int Polygon::get_typeid(){ return 5;}void Polygon::push(QPoint *p){ polygonStack.push_back(p);}QPoint *Polygon::top(){ return polygonStack[polygonStack.size() - 1];}Polygon::~Polygon(){ foreach(QPoint *p, polygonStack) { delete p; }}int Polygon::get_size(){ return polygonStack.size();}QPoint* Polygon::index(int pos){ return polygonStack[pos];}
//type.h
#ifndef TYPE_H#define TYPE_Henum type{type_Rect, type_Line, type_Pen, type_Ellipse, type_Polygon};#endif // TYPE_H
代码仍然还有部分问题,比如按住shift以后,虽然能画出正方形和正圆形,但是直线部分还有点问题
程序截图:
2 0
- Qt图形库——Qt画图板
- Qt入门 小程序之画图板
- C++ 图形用户界面库 QT
- QT笔记(5)——Qt图形视图框架实例
- Qt之QCustomPlot(图形库)
- QT 图形库 qcustomplot 坐标轴和网格线
- Qt 嵌入式图形开发
- QT 图形绘制
- QT图形引擎
- QT图形驱动加速器
- Qt绘制图形
- QT图形开发
- QT图形视图框架
- Qt 数字图形处理软件
- qt 自定义图形项
- QT图形变换技巧
- QT 基本图形绘制
- QT绘制图形
- python 类中的__nozero__ ,__len__ 重写,可以定义对象的布尔值是True or False
- Eclipse常用快捷键
- HDU 2874Connections between cities LCA
- NSString的常用方法
- Linux内核移植 part1:uboot 框架及移植
- Qt图形库——Qt画图板
- 依赖注入DI详解——媳妇儿写的
- 2016.05.05笔试
- xss攻击
- Spring官方文档翻译(1~6章)
- Quartz Core 图层编程
- ios ---对模型对象归档(NSKeyedArchiver、NSKeyedUnarchiver)
- C#中对象的拷贝
- UITouch