最近制作一个画板实现自定义绘图,之前写的画板程序是关于QPainter的,画布缩放效果不理想,也不能实现图元的平移,所以一直想写一个基于QGraphics的画板。

因为代码有点长,在这里分享绘制直线和圆的代码.

1、首先是mainwindow.h文件:声明相关的按钮控件和实现方法

extern bool isline; //在类声明之前,先声明全局变量,方便在主窗口调用extern bool iscircle;

private:QPushButton *line,*circle; //图形按钮选择QPushButton *finish; //绘图完成void Line();  //实现按钮函数void Circle();void Finish();

  2、mainwindow.cpp文件:

bool isline=false;  bool iscircle=false; //全局变量赋值
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);resize(1200,1000);//设置窗口大小line=new QPushButton("线",this); circle=new QPushButton("圆",this);finish=new QPushButton("完成",this);line->setGeometry(0,80,50,30);circle->setGeometry(0,110,50,30);finish->setGeometry(0,170,50,30);connect(line,&QPushButton::clicked,this,&MainWindow2::Line);connect(circle,&QPushButton::clicked,this,&MainWindow2::Circle);connect(finish,&QPushButton::clicked,this,&MainWindow2::Finish);Scene *scene=new Scene;  //自定义sceneMyview *view=new Myview;  //自定义viewQGridLayout *lay=new QGridLayout;view->setScene(scene);setCentralWidget(view);view->setGeometry(50,50,1000,800);view->translate(QPoint(-500,400));lay->addWidget(view);
}
void MainWindow::Line(){isline=true;   iscircle=false;
}
void MainWindow::Circle(){iscircle=true;   isline=false;
}
void MainWindow::Finish(){isline=iscircle=false;
}

  3、在自定义的scene里实现鼠标事件

myscene.h:

protected:void mouseMoveEvent(QGraphicsSceneMouseEvent *event); //移动void mousePressEvent(QGraphicsSceneMouseEvent *event);//按下void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);//松开
private:QPointF lastpoint,endpoint; //存储鼠标的按下和放开时的坐标

 myscene.cpp: 

#include "mainwindow.h" //用于调用主窗口的全局变量Scene::Scene(QWidget *parent):QGraphicsScene(parent)
{setSceneRect(-INT_MIN/2,-INT_MIN/2,INT_MAX,INT_MAX); //设置场景边界矩形
}
void Scene::mousePressEvent(QGraphicsSceneMouseEvent *event)
{if(event->button()==Qt::LeftButton){lastpoint=event->scenePos();}endpoint=lastpoint;
}
void Scene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{if(event->button()&Qt::LeftButton){endpoint=event->scenePos();update();}
}
void Scene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{if(event->button()==Qt::LeftButton){endpoint=event->scenePos();update();if(isline==true){ //接收到按钮信号后进行绘图if(lastpoint!=endpoint){ //避免画点的情况QGraphicsLineItem *line=new QGraphicsLineItem(lastpoint.x(),lastpoint.y(),endpoint.x(),endpoint.y());this->addItem(line);}}if(iscircle==true){qreal r=sqrt(pow((endpoint.x()-lastpoint.x()),2)+pow((endpoint.y()-lastpoint.y()),2));QGraphicsEllipseItem *circle=new QGraphicsEllipseItem(lastpoint.x()-r,lastpoint.y()-r,r*2,r*2);this->addItem(circle);}}
}

  4、完成自定义绘图后,可以直接引用之前图元缩放和平移的代码: https://www.cnblogs.com/Ivy-yang/p/tuzi-transform.html

转载于:https://www.cnblogs.com/Ivy-yang/p/tuzi-draw.html

基于QGraphics的简易画板1相关推荐

  1. 基于QGraphicsView的简易画板EasyCanvas -- 第一版

    最近使用 QGraphicsView 做了个简易的画板 EasyCanvas ,界面效果如下: 具有如下功能: 画布设置 图元添加和修改 保存为图片 第二版已更新 基于QGraphicsView的简易 ...

  2. java 2d划线 刷子_简易画板的JAVA实现

    要实现一个画图板,首先我们要掌握的是图形界面开发和事件监听机制.在Java中,图形界面开发有三套组件: 1.AWT组件:这是JDK1.0推出的图形组件类,位于java.awt这个包下.AWT组件被称为 ...

  3. java画板铅笔_简易画板的JAVA实现

    要实现一个画图板,首先我们要掌握的是图形界面开发和事件监听机制.在Java中,图形界面开发有三套组件: 1.AWT组件:这是JDK1.0推出的图形组件类,位于java.awt这个包下.AWT组件被称为 ...

  4. socketserver模块用法,多道技术、 基于UDP的简易版QQ

    复习 1.OSI七层2.以太网协议3.ip协议(arp协议)4.TCP5.UDP OSI七层 应表会 # 应用层 (HTTP协议, FTP协议)传输层 # 端口协议 在此层发挥作用网络层 # IP协议 ...

  5. [原创][连载].基于SOPC的简易数码相框 - Nios II SBTE部分(软件部分) - 从SD卡内读取图片文件,然后显示在TFT-LCD上...

    实在很抱歉,时间紧张,我只讲怎样从SD卡内读取bin文件(二进制文件),然后现在TFT-LCD上. 准备工具 1. Image2Lcd.zip 操作步骤 步骤1 寻找或制作240x320的图片 简单起 ...

  6. 简单计算器的设计java_(基于java的简易计算器的设计.doc

    (基于java的简易计算器的设计 基于java的简易计算器的设计 摘要 自从java语言诞生以来,java语言就以不可抵挡的趋势很快成为国际上广泛流行的面向对象编程语言,它既具有高级语言的特点,又少了 ...

  7. 基于stm32简易计算机电路图,基于STM32的简易电子计算器设计与实现(DOC).doc

    嵌入式系统设计实验综合设计报告 PAGE 四川师范大学成都学院通信工程学院 基于STM32的简易电子计算器设计与实现 实验综合设计报告 学生姓名 陶龑 学 号 2016301033 所在学院 通信工程 ...

  8. python实现简易聊天需要登录博客园zip下载_Python基于Socket实现简易多人聊天室的示例代码...

    前言 套接字(Sockets)是双向通信信道的端点. 套接字可以在一个进程内,在同一机器上的进程之间,或者在不同主机的进程之间进行通信,主机可以是任何一台有连接互联网的机器. 套接字可以通过多种不同的 ...

  9. 基于Zookeeper实现简易版服务的注册与发现机制

    一.功能要求 基于Zookeeper实现简易版服务的注册与发现机制 启动2个服务端 将服务端IP和端口信息注册到Zookeeper上 启动1个客户端 从Zookeeper中获取2个服务端节点信息 客户 ...

最新文章

  1. 性能测试通过几种方式造数据
  2. LeetCode Decode Ways
  3. CTFshow 反序列化 web264
  4. poj_2182 线段树/树状数组
  5. C++Primer::头文件设计基本原则 与 预处理器介绍
  6. 《人生一串》第二季收官 B站播放量突破5400万
  7. Linux内核深入理解系统调用(1):初始化-入口-处理-退出
  8. tf 设置多显卡_用树莓派搭建私人简易网盘 2/5 树莓派4B初始设置
  9. Fort.js – 时尚、现代的进度提示效果
  10. TestNg测试框架使用
  11. 数列收敛,极限值唯一
  12. MATLAB函数unidrnd简介
  13. 零差检测,外差检测 以及 激光雷达中的零差探测和外差探测
  14. 关于申请博客园开通博客功能
  15. flutter中播放音乐
  16. 《linux多线程服务端编程》---- C++基础前奏
  17. omnigraffle mac 破解
  18. 最简单ListView显示联系人姓名和电话号码
  19. C# MethodInvoker委托的使用
  20. 《OSPF和IS-IS详解》一1.7 独立且平等

热门文章

  1. linux内核实验教程答案,20199310《Linux内核原理与分析》第十五周作业 Linux安全实验...
  2. 如何使用dtls协议抵御重放攻击
  3. c++ regex用法实例
  4. mysql 单机_mysql单机多实例——方法1
  5. 知云文献翻译_工具推荐 | 知云学术翻译,让外文文献阅读不再难
  6. 我的一些学习经验:概述
  7. 深度优先遍历和广度优先遍历_图与深度优先搜索和广度优先搜索
  8. 【java】JDK中注解的底层实现
  9. 60-030-020-使用-UI-Flink 上下游算子并发之间的数据传递方式 Partitioner
  10. 【Flink】ValidationException: Comparison is only supported for numeric types and comparable types