Qt实训项目----(1)

1. 创建窗体工程mainwindow,并且在窗体绘画区域内加载并显示图片;
2. 在工具栏中添加绘图工具,点击后由默认图标变为“+”图标,并且能使用操作工具在绘图区内画任一图形(三角形、正方形、圆形等);
3. 在绘图区内实现右键取消绘图功能;

创建工程就不再赘述了,在窗体绘画区域内加载并显示图片,有好几种做法,在这里由于还需要后面功能的使用,我们就只用重绘事件来显示了

void MainWindow::paintEvent(QPaintEvent *event)
{Q_UNUSED(event);QPainter p(this);QPen pen(QColor(255,0,0));
//    QBrush brush(QColor(0,255,0,125));p.setPen(pen);
//    p.setBrush(brush);p.setRenderHint(QPainter::Antialiasing);//把图片绘制到绘图区域QPixmap pix;  //必须实例化一个pix才能去绘制pix.load(":/new/img/earth.jpg");p.drawPixmap(0,25,ui->centralWidget->width(),ui->centralWidget->height(),pix)}

由于我们是直接绘制到绘图区域内,那么我们可以直接用画笔绘制(当然你也可以用画布,但是画布比较麻烦就不演示了毕竟也是新手)。 -----在这里我们要注意,所谓的绘画区域是工具栏和状态栏之间的部分,所以我们用p.drawPixmap(0,0,pix)是错误的,因为这样绘制的图片超过了绘图区域(还得看你们经理的想法,我开始也是这样用的,但是在我经理那里不通过)。而且这里的25是我测过的工具栏的宽度,当然如何要细节的话就得写成p.drawPixmap(0,rect.height(), ui->centralWidget->width(),ui->centralWidget->height(),pix); 这里的rect对象还得定义就不多说了。

然后在工具栏中添加操作工具(直接最简单的),使用ui直接在界面里面添加相应的动作,然后给拖到工具栏即可(如何添加就不再多说了,如果不会,那就证明你不适合这行,趁早转业把,QAQ)。
这里多添加了两个操作工具是因为我后面要用到。~

点击后会转变为“+”图标。—知道要在点击后改变,证明只在这一段生命周期有用,所以我们只需要在槽函数设置为开始转变,功能完成之后就初始化就好了。

void MainWindow::on_actionLine_triggered()
{setCursor(Qt::CrossCursor);_drawState=1;
}void MainWindow::on_actionRect_triggered()
{setCursor(Qt::CrossCursor);_drawState=2;
}void MainWindow::on_actionEllipse_triggered()
{setCursor(Qt::CrossCursor);_drawState=3;
}void MainWindow::on_actionTriangle_triggered()
{setCursor(Qt::CrossCursor);_drawState=4;
}

由于这里有好几个功能,所以我们要设置一个状态去分辨。_drawState就是我们设置的状态,而这里的状态刚好在绘制图形中分辨。 setCursor(Qt::CrossCursor)这个函数就是鼠标变化之后的函数,由于在枚举类中有定义就不用我们再次加载资源了。

然后就是我们的绘制图形的功能了,需要用鼠标点击事件和重绘事件相联系才可以实现,我直接上代码,打字有点累

void MainWindow::mousePressEvent(QMouseEvent *event)  //鼠标点击事件
{if(event->button()==Qt::LeftButton){if(_drawState==0)  //判断状态为初始状态(没有槽函数发生){return;  //返回}else if(_drawState==1)  //直线{if(_startPoint.isNull()){_startPoint=event->pos();}else{_endPoint=event->pos();_drawState=0;  //操作完毕,恢复初始化状态_drawType=1;qDebug()<<"_startPoint:"<<_startPoint;qDebug()<<"_endPoint:"<<_endPoint;update();  //进行重绘事件(别忘了在重绘之后对start和end初始化)}}else if(_drawState==2)  //矩形{if(_startPoint.isNull()){_startPoint=event->pos();}else{_endPoint=event->pos();_drawState=0;  //操作完毕,恢复初始化状态_drawType=2;qDebug()<<"_startPoint:"<<_startPoint;qDebug()<<"_endPoint:"<<_endPoint;off_x=_endPoint.x()-_startPoint.x();off_y=_endPoint.y()-_startPoint.y();update();  //进行重绘事件并且对start和end进行初始化}}else if(_drawState==3)  //圆形{if(_startPoint.isNull()){_startPoint=event->pos();}else{_endPoint=event->pos();_drawState=0;  //操作完毕,恢复初始化状态_drawType=3;qDebug()<<"_startPoint:"<<_startPoint;qDebug()<<"_endPoint:"<<_endPoint;off_x=_endPoint.x()-_startPoint.x();off_y=_endPoint.y()-_startPoint.y();d=sqrt(off_x*off_x+off_y*off_y);update();  //进行重绘事件并且初始化start和end}}else if(_drawState==4)  //三角形{if(_point1.isNull()){_point1=event->pos();}else if(_point2.isNull()){_point2=event->pos();}else if(_point3.isNull()){_point3=event->pos();_drawState=0;  //操作完毕,初始化状态_drawType=4;qDebug()<<"_point1:"<<_point1;qDebug()<<"_point2:"<<_point2;qDebug()<<"_point3:"<<_point3;update();  //进行重绘事件并且初始化point三个点}}
}
void MainWindow::paintEvent(QPaintEvent *event)  //重绘事件
{Q_UNUSED(event);QPainter p(this);QPen pen(QColor(255,0,0));
//    QBrush brush(QColor(0,255,0,125));p.setPen(pen);
//    p.setBrush(brush);p.setRenderHint(QPainter::Antialiasing);if(_drawType==1){//直线p.drawLine(_startPoint,_endPoint);//初始化并且鼠标恢复_startPoint=QPoint(0,0);_endPoint=QPoint(0,0);setCursor(Qt::ArrowCursor);}else if(_drawType==2){//矩形  p.drawRect(_startPoint.x(),_startPoint.y(),off_x,off_y);//初始化_startPoint=QPoint(0,0);_endPoint=QPoint(0,0);off_x=0;off_y=0;setCursor(Qt::ArrowCursor);}else if(_drawType==3){//圆形p.drawEllipse(QPointF(_startPoint.x()+off_x/2,_startPoint.y()+off_y/2),d/2,d/2);//初始化              _startPoint=QPoint(0,0);_endPoint=QPoint(0,0);off_x=0;off_y=0;d=0;setCursor(Qt::ArrowCursor);}else if(_drawType==4){//三角形QPointF points[3]={QPointF(_point1.x(),_point1.y()),QPointF(_point2.x(),_point2.y()),QPointF(_point3.x(),_point3.y()),};p.drawPolygon(points,3);//三角形---连接三条线   ---第二种方法
//        p.drawLine(_point1,_point2);
//        p.drawLine(_point1,_point3);
//        p.drawLine(_point2,_point3);//初始化_point1=QPointF(0.0,0.0);_point2=QPointF(0.0,0.0);_point3=QPointF(0.0,0.0);setCursor(Qt::ArrowCursor);}
}

绘制的功能完成了,还剩下右键取消绘制功能。相信每个人一想到取消绘制功能就会想到 .clear()函数吧,很抱歉这里没法用,这样我们要怎么办呢?很简单它他一个值,你只要看不见就行了,在我们窗口的外面赋值就行了

void MainWindow::mousePressEvent(QMouseEvent *event)
{if(event->button()==Qt::LeftButton){...}else if(event->button()==Qt::RightButton){_drawState=0;_startPoint=QPoint(-1,-1);  //直线矩形圆形的初始点和结束点_endPoint=QPoint(-1,-1);_point1=QPointF(-1.0,-1.0);  //三角形的三个点_point2=QPointF(-1.0,-1.0);_point3=QPointF(-1.0,-1.0);update();}
}

在这里我们把点直接去赋值到我们看到的窗口外面就好了。

这里很多东西我只是复制的核心代码,好多东西都需要我们去声明和定义!!!

好了就这我们就完成了很简单的一个Qt的小项目,后面再慢慢更新!!!

Qt实训项目----(1)相关推荐

  1. 实训项目2Linux基本命令,实训项目2 Linux文件系统管理

    实训项目2 Linux文件系统管理 发布时间:2011-06-24 15:51:10来源:红联作者:397778823 一. 实训目的: 1. 掌握磁盘分区的方法: 2. 掌握文件系统的建立.挂装.解 ...

  2. python实训项目-黑马程序员上海校区Python21期Django项目实训

    黑马程序员上海中心 月薪一万只是起点 关注 晚上十点,一名名Python学生正在酣畅淋漓地撸代码,手指不间断地敲击着键盘,发出机械而清脆的声音. 各个小组在经过为期4天的django项目小组开发,终于 ...

  3. 安卓实训项目:基于储存卡音乐播放器实训报告5.0

    安卓实训项目:基于储存卡音乐播放器实训报告5.0 (一)功能要求 在基于存储卡音乐播放器V0.4基础上,作如下修改: 1.创建应用程序常量接口保存广播频道常量 2.在音乐播放器应用程序类里添加两个属性 ...

  4. android 实训的背景,Android实训项目作业.doc

    Android实训项目作业 2-1用整型数计算两个数的和2 2-7排列任意4个数的顺序,按从小到大顺序输出2 2.1编写显示下列图形的程序.2 3.1编写程序,当点击按钮命令后,页面标题及文本组件的文 ...

  5. java实训手册_java实训项目用户手册

    java实训项目用户手册 1 用户手册 第 1章 引言 1.1编写目的编写本手册的主要目的是为了方便使用的用户管理系统能够更加方便使用 此系统,以及更快的掌握JDK,MySQL,MyEclipse使之 ...

  6. 2020年Java实训项目【GUI学生信息管理系统】目录

    Java实训项目1:GUI学生信息管理系统 - 实训概述 Java实训项目2:GUI学生信息管理系统 - 系统概述 Java实训项目3:GUI学生信息管理系统 - 涉及知识点 Java实训项目4:GU ...

  7. Java实训项目1:GUI学生信息管理系统 - 实训概述

    文章目录 一.实训概述 1.实训目的 2.实训项目简介 3.项目开发思维导图 4.实训日志模板 5.实训报告模板 6.实训考核标准 一.实训概述 1.实训目的 让学生综合运用J2SE有关知识开发[学生 ...

  8. Java实训项目:GUI学生信息管理系统(2019)【下】

    Java实训项目:GUI学生信息管理系统(2019)[下] 本篇目录 六.实现步骤 13.应用程序类 14.窗口界面类(JFrame)

  9. Java实训项目:GUI学生信息管理系统(2019)【中】

    Java实训项目:GUI学生信息管理系统(2019)[中] 本篇目录 四.涉及知识点 1.Java基本语法 2.Java流程控制

最新文章

  1. cas+shiro+spring 单点登录
  2. 悲观锁和乐观锁_乐观锁和悲观锁 以及 乐观锁的一种实现方式-CAS
  3. python reduce函数 day16
  4. FireFox与IE的兼容
  5. 如何在32位程序中突破地址空间限制使用超过4G的内存
  6. 中文乱码问题解决方法总结
  7. 奇偶个数 中国大学生mooc 翁恺 C语言
  8. PowerVim - 强大的vim配置
  9. 2017-5-26 正则表达式,js实战(加减数量,全选)
  10. java中使用unzip_unzip命令_Linux unzip命令用法示例详解
  11. 记录日常收支,查看每个账户收支明细
  12. Android 10.0 PackageManagerService(四)APK安装流程-[Android取经之路]
  13. python ipo模型是什么意思_IPO里的估值模型是什么情况?
  14. 有限维空间上的线性算子
  15. 2021年电子元器件行业涨价趋势已现
  16. 测试三星手机性能软件,一加三星小米华硕4部手机性能测试:一加手机6T仍是机皇...
  17. vim 强制保存修改只读文件
  18. 利用飞书来实现信息存储和在线远程预览
  19. Syste类 及常用方法
  20. python怎么弄成白色背景_python – 在matplotlib中为colorbar添加白色背景

热门文章

  1. 数据访问层的优化思路(r10笔记第80天)
  2. 用Linux Deploy在Android手机上安装Linux
  3. 可枚举属性和不可枚举属性(for...in循环和Objec.keys()和Object.getOwnPropertyNames())
  4. 下一个颠覆的领域:区块链如何影响审计行业?(上)
  5. 色子骰子定位识别C++/Python
  6. 零基础Unreal Engine 4(UE4)图文笔记之粒子系统(九)
  7. php colspan,PHPWord生成word实现table合并(colspan和rowspan)
  8. 【学习:php面向对象编程】
  9. 《隐动力》之:伟人脱险记冯学荣读史新浪博客
  10. 三次握手,四次挥手,为什么是三次握手四次挥手