说明:这是我们Qt系列文章的一个例子,请先学习2D绘图部分内容,再学习本教程

前面学习了Qt 2D绘图的基本知识,现在我们将所学习的知识进行一下综合,设计一个简单的画图软件。

因为前面已经有了记事本的例子,所以这里对一些细节知识将不会多讲。而且,这只是个例子,说是软件,其实只是个较大点的程序而已,并不是实际的项目,所以通过这个例子,我们主要为了掌握一个方法和两个知识点。

一个方法:写较复杂程序的方法。

两个知识点:文件菜单的功能实现和利用双缓冲进行绘图。

这个例子共分为三部分进行介绍:

第一部分:进行软件界面的设计。其中一些知识可以参考我博客中的Qt教程四。

第二部分:实现基本的功能,这里会再次详细介绍文件菜单中新建,打开,保存,另存为,关闭等菜单的功能实现。这里你可以参考我博客中的Qt教程六。

第三部分:我们在这里会详细讲解所谓的双缓冲绘图,利用它实现图形(例如矩形,椭圆)的交互式绘制。

第一部分:设计界面

在windows上自带了画图软件,在Qt Creator中也有个绘图软件的例子scribble example,你可以在帮助中进行查看。

而现在我们要写的绘图程序的例子,也应该包含这些功能,如绘画涂鸦,添加直线或矩形等常用图形,可以插入图片,在图片上进行绘画,可以让它缩放,旋转,拉伸等。想到了这些功能,我们就可以设计软件的界面了。

一.设计菜单

在QtCreator中新建Qt4 Gui Application工程,我这里使用的工程名为paint,使用默认的QMainWindow作为主窗口。

为了让程序中可以使用中文,我们先在main.cpp中加入头文件#include ,

并加入下面一行代码:QTextCodec::setCodecForTr(QTextCodec::codecForLocale());

打开mainwindow.ui,先设计菜单。依次是文件菜单,编辑菜单,工具菜单和帮助菜单。其内容分别如下:

文件菜单

编辑菜单

工具菜单

帮助菜单

向工程中添加资源文件,向其中添加要使用的菜单图标。

添加完后记着保存一下资源文件,不然的话,在资源管理器中可能看不到添加的图标。

打开动作编辑器Action Editor,编辑已添加的菜单动作。

我们下面只介绍其中“新建”菜单的编辑,其余菜单照做就行了。

双击action_N,弹出如下对话框:

单击Icon后面的按钮,弹出资源管理器:

我们点击上面的Reload,便能显示出我们已经添加的图标,我们选中其中的新建菜单的图标,点击Ok确认,如下图所示:

然后我们再在右面的属性窗口中更改statusTip的内容为“新建文件”,这样在鼠标放在新建菜单上是,状态栏就会显示“新建文件”。如下图:

我们按照同样的方法设置其它菜单,设置完成后如下图所示:

我们把其中的一些图标放到工具栏上,如下图所示:

这样就完成了菜单的设计。

二.添加绘图工具栏

我们这里的绘图工具栏使用的是一种叫做Dock的窗口,它与其它窗口的不同就是它可以在其父窗口中浮动,也可以停靠在父窗口的边界,就像一个工具栏一样。

我们在左边的部件栏中找到Dock Widget,将其拖入到设计区。

添加后它默认在左边框上停靠着。如下图:

我们在其属性栏里将其windowTitle改为“画图工具”。

向其中拖入相关部件,效果如下图:

其中,画笔线宽下的部件为Spin Box,其属性中的objectName为penWidthSpinBox,属性栏最下面的minimum属性改为1,即最小值为1。

其余部件均为组合框ComboBox,objectName依次为:

选择图形:shapeComboBox

画笔类型:penStyleComboBox

画笔颜色:penColorComboBox

填充颜色:brushColorComboBox

我们给选择框添加条目。

右击“选择图形”下面的组合框,弹出菜单,如下:

我们点击Edit Items菜单,弹出下面的条目编辑框,我们点击“+”按钮,添加新的条目:

我们依次添加“无”“直线”“矩形”“椭圆”四个条目,如下所示:

同样的我们给“画笔类型“下的组合框添加两个条目“实线”和“点线”。两个颜色组合框的条目以后再添加。

最后可以让所有部件处于一个网格布局管理器中。

此时运行程序,效果如下:

拖动画图工具栏后效果如下:

三.添加画布

因为画布是真正实现绘图功能的,所以我们新建一个类来实现所有跟绘图有关的功能。这里先进行操作,对于一些内容到后面我们会详细解释的。

往工程中添加新的C++类,类名为PaintArea,以QWidget作为基类,如下所示:

2.在paintArea.h中声明对象和函数。

我们这里使用了QImage类对象进行绘图,其实使用以前讲过的QPixmap类对象也是可以的。

classPaintArea:publicQWidget

{

public:

PaintArea();

protected:

voidpaintEvent(QPaintEvent*);//重绘事件

private:

QImageimage;//QImage类对象,用于在其上绘图

QRgbbackColor;//QRgb颜色对象,存储image的背景色

};

在paintarea.cpp中的构造函数里初始化对象。

先加入头文件声明:#include

再更改构造函数:

PaintArea::PaintArea()

{

image=QImage(400,300,QImage::Format_RGB32);//画布的初始化大小设为400*300,使用32位颜色

backColor=qRgb(255,255,255);//画布初始化背景色使用白色

image.fill(backColor);

}

在paintarea.cpp中定义重绘函数。

voidPaintArea::paintEvent(QPaintEvent*)

{

QPainterpainter(this);

painter.drawImage(0,0,image);

}

将画布添加到主界面的中心区。

因为以后可能要使用很大的画布,这样为了使画布很大时还能显示,我们需要加入滚动条,所以这里使用了QScrollArea类对象,它提供了横向和纵向的滚动条,如果你有兴趣,可以在帮助中查看它的介绍。

首先,在mainwindow.h文件中进行如下操作:

添加头文件声明:

#include “paintarea.h”

#include

在下面的`private`中添加对象的声明:

`PaintArea*area;`

`QScrollArea*scrollArea;`

然后在`mainwindow.cpp`文件中的构造函数里添加代码:

MainWindow::MainWindow(QWidget*parent):

QMainWindow(parent),

ui(newUi::MainWindow)

{

ui->setupUi(this);

resize(700,500);//主窗口大小设为700*500

area=newPaintArea;

scrollArea=newQScrollArea;

scrollArea->setBackgroundRole(QPalette::Dark);//scrollArea对象的背景色设为Dark

scrollArea->setWidget(area);//将画布添加到scrollArea中

scrollArea->widget()->setMinimumSize(800,600);//scrollArea初始化大小设为800*600

setCentralWidget(scrollArea);//将scrollArea加入到主窗口的中心区

}

这时运行程序,效果如下:

四.实现涂鸦的功能

我们在画布类中添加一些代码,实现最基本的涂鸦功能。

在paintarea.h中做更改。

添加头文件:

#include

#include

在protected中添加函数声明:

void mousePressEvent(QMouseEvent *); //鼠标按下事件

void mouseMoveEvent(QMouseEvent *); //鼠标移动事件

void mouseReleaseEvent(QMouseEvent *); //鼠标释放事件

在private中添加对象声明:

QPoint lastPoint,endPoint; //定义两个坐标对象存放鼠标指针的前后两个坐标

在paintarea.cpp中添加函数的定义。

voidPaintArea::mousePressEvent(QMouseEvent*event)

{

if(event->button()==Qt::LeftButton)//当鼠标左键按下

{

lastPoint=event->pos();//获得鼠标指针的当前坐标作为起始坐标

}

}

voidPaintArea::mouseMoveEvent(QMouseEvent*event)

{

if(event->buttons()&Qt::LeftButton)//如果鼠标左键按着的同时移动鼠标

{

endPoint=event->pos();//获得鼠标指针的当前坐标作为终止坐标

paint(image);//绘制图形

}

}

voidPaintArea::mouseReleaseEvent(QMouseEvent*event)

{

if(event->button()==Qt::LeftButton)//如果鼠标左键释放

{

endPoint=event->pos();

paint(image);

}

}

voidPaintArea::paint(QImage&theImage)

{

QPainterpp(&theImage);//在theImage上绘图

pp.drawLine(lastPoint,endPoint);//由起始坐标和终止坐标绘制直线

lastPoint=endPoint;//让终止坐标变为起始坐标

update();//进行更新界面显示,可引起窗口重绘事件,重绘窗口

}

这样,再次运行程序就能实现涂鸦的功能了,效果如下:

qt实现涂鸦板_Qt涂鸦板程序图文详细教程相关推荐

  1. [转载]Qt涂鸦板程序图文详细教程..Qt涂鸦板程序图文详

    原文地址:Qt涂鸦板程序图文详细教程..Qt涂鸦板程序图文详细教程..作者:棰滈櫟鍚 Technorati 标签: QT http://www.yafeilinux.com/?p=379 (说明:这是 ...

  2. Qt移植:Ubuntu16.04 交叉编译qt5.9.6详细教程

    前言: 项目需要移植qt到arm开发板上,历经千辛万苦解决了各种问题,最后终于成功了,所以整理了开发笔记给更多的小伙伴参考. 1.准备阶段 ①下载交叉编译器aarch65-linux-gnu,下载地址 ...

  3. 使用Visual Studio 2019创建安装程序的详细教程

    VS2019 制作Setup Project详细教程 对于windows平台,可以使用Visual Studio 提供的Setup Project 来制作程序的安装包.本教程主要介绍VS2019如何安 ...

  4. python教程程序_Python如何发布程序的详细教程

    如何发布一个Python程序: 1.安装一个pyInstaller 在pycharm里点 file -–>setting-–>Project workspace-->Interpre ...

  5. 【快速入门】创建你的第一个linux程序(详细教程)

    介于有些同学想学习linux,但是又不知道如何着手,希望笔者能这篇博客给大家简单的参考,运行环境为centos+xshell. 一.快速入门 1.打开Linux命令行,输入以下命令,创建出名叫hell ...

  6. 基于VS2015,MFC平台的上位机串口程序搭建详细教程(兼容debug x64、win32 、x86等解决方案平台)

    通常在32位编译环境下,我们可以通过插入MFC串口控件(MSCOMM32.OCX)的方式来实现串口通信,但是MSCOMM32.OCX不支持64位编译环境,也就是说,在x64解决方案平台下会报错.为此, ...

  7. ecshop整合最土团购程序(uc)详细教程

    今天客户问我们能不能在ECSHOP商城下面加个每日团购功能,当然这里我们最后选择了最土的商业版程序,功能还算完善吧!    第一,我们要考虑会员的同步问题,这个就不用多说了,首先我就象到了UCENTE ...

  8. Windows7下JavaEE(jsp开发环境)快速搭建+第一个jsp程序 超详细教程

    下学期就要学JavaEE了,主要的内容是jsp(Java Server Page)的开发.趁着暑假,就想先练练手.第一步要做的就是开发环境的搭建,看上去很麻烦,其实非常简单~ Step1:先从网上下载 ...

  9. Inno Steup 6 下载,安装,将 .exe 文件打包成安装程序(详细教程)

    下载 点击链接进入官网:https://jrsoftware.org/isdl.php 选则版本后,点击下载(以6.2.0版本为例) 等待下载完成 下载完成 安装 双击文件运行 选中语言,默认 Eng ...

  10. 在iTunes中安装ipad应用程序图文详细步骤

    第一步:下载iTunes(有时会提示启动bonjour服务,那就得安装bonjour),iTunes下载地址:http://www.apple.com.cn/itunes/,bonjour下载地址:h ...

最新文章

  1. Direct3D Draw函数 异步调用原理解析
  2. oracle数据库行争用,Oracle技术之数据库高回滚争用的问题
  3. Maven的-pl -am -amd参数学习
  4. Hadoop HBase概念学习系列之HBase里的客户端和HBase集群建立连接(详细)(十四)...
  5. IdentityServer4学习笔记汇总(实现传送门在底部)
  6. 爬虫教程( 4 ) --- 分布式爬虫 scrapy-redis、集群
  7. 使用SpringMVC参数传递时,解决get请求时中文乱码的问题
  8. @import注解_Spring Boot 2 实战:@SpringBootApplication注解浅析
  9. 面试题40. 最小的k个数
  10. 4n35光耦引脚图_光耦合器隔离技术在工业环境中的应用!-先进光半导体
  11. 论文阅读笔记 | 三维目标检测——AVOD算法
  12. 史上最全IT技能学习大全公众号
  13. 腾讯云即时通讯IM_ 小贴士
  14. Request processing failed; nested exception is com.alibaba.dubbo.rpc.RpcException问题 学习记录
  15. sfp寄存器_查看光模块信息 - E600 V200R011C10 配置指南-设备管理 - 华为
  16. 东方航空:无畏挑战,做开源数据库转型先行者
  17. python学习(列表,元祖)
  18. 读《洞穴奇案》——功利主义与法的精神
  19. 2022年建筑设计中效果图渲染常见的7个错误
  20. [家里蹲大学数学杂志]第389期中国科学院大学2014-2015-1微积分期中考试试题参考解答...

热门文章

  1. java swing tooltips_【Unity笔记】提示框ToolTips大小自适应,及其闪烁的问题
  2. 大事务的处理方式对比
  3. Win11 DELL - G7 如何开启TPM模块
  4. 【硬见小百科】开关电源电路组成及各部分详解
  5. 基于MATLAB的极限与求导(附完整代码)
  6. [BTS] Unable to create the transform
  7. 斯坦福大学公开课IOS 7学习笔记 (1)
  8. led灯光衰怎么解决_led灯光衰一般多少为正常?
  9. 文本挖掘与matlab,文本挖掘与数据挖掘:发现差异
  10. 财源滚滚的第三方支付牌照