Qt-5开发及实例-第6章-Qt-5图形与图片课件.pptx
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《Qt-5开发及实例-第6章-Qt-5图形与图片课件.pptx》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Qt 开发 实例 图形 图片 课件
- 资源描述:
-
1、第第6章章 Qt 5图形与图片图形与图片Qt 5位置相关函数位置相关函数0101区区 别别 概概 述述区区 别别 概概 述述Qt提供了很多关于获取窗体位置及显示区域大小的函数,如x()、y()和pos()、rect()、size()、geometry()等,统称为“位置相关函数”或“位置函数”。几种主要位置函数及其之间的区别如图6.1所示。区区 别别 概概 述述其中,其中,x()、y()和pos()函数的作用都是获得整个窗体左上角的坐标位置。frameGeometry()函数与geometry()函数相对应。frameGeometry()函数是获得整个窗体的左上顶点和长、宽值,而geometr
2、y()函数获得的是窗体内中央区域的左上顶点坐标及长、宽值。直接调用width()和height()函数获得的是中央区域的长、宽值。rect()、size()函数获得的结果也都是对于窗体的中央区域而言的。size()函数获得的是窗体中央区域的长、宽值。rect()函数与geometry()函数相同,返回一个QRect对象,这两个函数获得的长、宽值是相同的,都是窗体中央区域的长、宽值,只是左上顶点的坐标值不一样。geometry()函数获得的左上顶点坐标是相对于父窗体而言的坐标,而rect()函数获得的左上顶点坐标始终为(0,0)。0202“实例实例”位置函数的应用位置函数的应用“实例实例”位置函
3、数的应用位置函数的应用【例】【例】(难度一般)(CH601)设计界面,当改变对话框的大小或移动对话框时,调用各个函数所获得的信息也相应地发生变化,从变化中可得知各函数之间的区别。具体实现步骤如下。(1)新建Qt Widgets Application(详见1.3.1节),项目名称为“Geometry”,基类选择“QDialog”,类名命名为“Geometry”,取消取消“创建界面”复选框的选中状态。单击“下一步”按钮,最后单击“完成”按钮,完成该项目工程的建立。(2)Geometry类继承自QDialog类,在头文件中声明所需的控件(主要为QLabel类)及所需要的函数。打开“geometry
4、.h”头文件,添加如下代码。(3)在构造函数中完成控件的创建及初始化工作,打开“geometry.cpp”文件,添加如下代码。updateLabel()函数完成获得各位置函数的信息并显示功能,具体代码。“实例实例”位置函数的应用位置函数的应用重新定义QWidget的moveEvent()函数,响应对话框的移动事件,使得窗体在被移动时能够同步更新各函数的显示结果,具体代码如下:void Geometry:moveEvent(QMoveEvent*)updateLabel();重新定义QWidget的resizeEvent()函数,响应对话框的大小调整事件,使得在窗体大小发生改变时,也能够同步更新
5、各函数的显示结果,具体代码如下:void Geometry:resizeEvent(QResizeEvent*)updateLabel();“实例实例”位置函数的应用位置函数的应用(4)运行程序,效果如图6.2所示。第第6章章 Qt 5图形与图片图形与图片Qt 5基础图形的绘制基础图形的绘制【例】【例】(难度中等)(CH602)设计界面,区分各种形状及画笔颜色、画笔线宽、画笔风格、画笔顶帽、画笔连接点、填充模式、铺展效果、画刷颜色、画刷风格设置等。0101绘图框架设计绘图框架设计绘图框架设计绘图框架设计利用QPainter绘制各种图形使用的框架的实例如图6.3所示。绘图框架设计绘图框架设计此实
6、例的具体实现包含两个部分的内容:一是用于画图的区域PaintArea类,二是主窗口MainWidget类。绘制各种图形实例的框架如图6.4所示。绘图框架设计绘图框架设计具体实现步骤如下。具体实现步骤如下。(1)新建Qt Widgets Application(详见1.3.1节),项目名称为“PaintEx”,基类选择“QWidget”,类名命名为“MainWidget”,取消取消“创建界面”复选框的选中状态。单击“下一步”按钮,最后单击“完成”按钮,完成该项目工程的建立。(2)添加该工程的提供实现绘图区的函数所在的文件,在“PaintEx”项目名上单击鼠标右键,在弹出的快捷菜单中选择“添加新文
7、件.”选项,在弹出的对话框中选择“C+Class”选项。单击“Choose.”按钮,在弹出的对话框的“Base class”下拉列表框中选择基类名“QWidget”,在“Class name”文本框中输入类的名称“PaintArea”。(3)单击“下一步”按钮,单击“完成”按钮,添加文件“paintarea.h”和文件“paintarea.cpp”。0202绘图区的实现绘图区的实现绘图区的实现绘图区的实现打开“paintarea.h”头文件,添加如下代码:#include#include class PaintArea:public QWidget Q_OBJECTpublic:enum Sh
8、apeLine,Rectangle,RoundRect,Ellipse,Polygon,Polyline,Points,Arc,Path,Text,Pixmap;explicit PaintArea(QWidget*parent=0);void setShape(Shape);void setPen(QPen);void setBrush(QBrush);void setFillRule(Qt:FillRule);void paintEvent(QPaintEvent*);signals:public slots:private:Shape shape;QPen pen;QBrush brus
9、h;Qt:FillRule fillRule;绘图区的实现绘图区的实现PaintArea类的构造函数用于完成初始化工作,设置图形显示区域的背景色及最小显示尺寸,具体代码如下:#include paintarea.h#include PaintArea:PaintArea(QWidget*parent):QWidget(parent)setPalette(QPalette(Qt:white);setAutoFillBackground(true);setMinimumSize(400,400);其中,其中,setPalette(QPalette(Qt:white)、setAutoFillBack
10、ground(true)完成对窗体背景色的设置,与下面的代码效果一致:QPalette p=palette();p.setColor(QPalette:Window,Qt:white);setPalette(p);绘图区的实现绘图区的实现setShape()函数可以设置形状,setPen()函数可以设置画笔,setBrush()函数可以设置画刷,setFillRule()函数可以设置填充模式,具体代码实现如下:void PaintArea:setShape(Shape s)shape=s;update();void PaintArea:setPen(QPen p)pen=p;update();
11、void PaintArea:setBrush(QBrush b)brush=b;update();void PaintArea:setFillRule(Qt:FillRule rule)fillRule=rule;update();/重画绘制区窗体PaintArea类的重画函数代码。其中,其中,(a)QRect rect(50,100,300,200):设定一个方形区域,为画长方形、圆角方形、椭圆等做准备。(b)static const QPoint points4=:创建一个QPoint的数组,包含四个点,为画多边形、多边线及点做准备。(c)int startAngle=30*16、int
12、 spanAngle=120*16:其中,参数startAngle表示起始角,为弧形的起始点与圆心之间连线与水平方向的夹角;参数spanAngle表示的是跨度角,为弧形起点、终点分别与圆心连线之间的夹角,如图6.5所示。(d)switch(shape):使用一个switch()语句,对所要画的形状做判断,调用QPainter的各个draw()函数完成图形的绘制。绘图区的实现绘图区的实现绘图区的实现绘图区的实现(1)利用QPainter绘制图形(Shape)。Qt为开发者提供了丰富的绘制基本图形的draw()函数,如图6.6所示。绘图区的实现绘图区的实现(2)利用QPainterPath绘制简单
13、图形。利用QPainterPath绘制简单图形,QPainterPath类为QPainter类提供了一个存储容器,里面包含了所要绘制的内容的集合及绘制的顺序,如长方形、多边形、曲线等各种任意图形。当需要绘制此预先存储在QPainterPath对象中的内容时,只需调用QPainter类的drawPath()函数即可。QPainterPath类提供了许多函数接口,可以很方便地加入一些规则图形。例如,addRect()加入一个方形,addEllipse()函数加入一个椭圆形,addText()函数加入一个字符串,addPolygon()函数加入一个多边形等。同时,QPainterPath类还提供了a
14、ddPath()函数,用于加入另一个QPainterPath对象中保存的内容。QPainterPath对象的当前点自动处在上一部分图形内容的结束点上,若下一部分图形的起点不在此结束点,则需调用moveTo()函数将当前点移动到下一部分图形的起点。cubicTo()函数绘制的是贝赛尔曲线,如图6.7所示。绘图区的实现绘图区的实现利用QPainterPath类可以实现QPainter类的draw()函数能够实现的所有图形。例如,对于QPainter:drawRect()函数,除可用上面介绍的QPainterPath:addRect()的方式实现外,还可以用如下方式实现:QPainterPath p
15、ath;path.moveTo(0,0);path.lineTo(200,0);path.lineTo(200,100);path.lineTo(0,100);path.lineTo(0,0);这是一个更通用的方法,其他(如多边形等)图形都能够使用这种方式实现。0303主窗口的实现主窗口的实现主窗口的实现主窗口的实现主窗口类MainWiget继承自QWidget类,包含完成各种图形参数选择的控制区的声明、一系列设置与画图相关参数的槽函数的声明,以及一个绘图区PaintArea对象的声明。打开“mainwidget.h”头文件,添加如下代码。MainWiget类的构造函数中创建了各参数选择控件,
16、打开“mainwiget.cpp”文件,添加如下代码。其中,其中,(a)shapeComboBox-addItem(tr(Line),PaintArea:Line):QComboBox的addItem()函数可以仅插入文本,也可同时插入与文本相对应的具体数据,通常为枚举型数据,便于后面操作时确定选择的是哪个数据。(b)penStyleComboBox-addItem(tr(SolidLine),static_cast(Qt:SolidLine):选用不同的参数,对应画笔的不同风格,如图6.8所示。主窗口的实现主窗口的实现(c)penCapComboBox-addItem(tr(SquareCa
17、p),Qt:SquareCap):选用不同的参数,对应画笔顶帽的不同风格,如图6.9所示。其中,其中,Qt:SquareCap表示在线条的顶点处是方形的,且线条绘制的区域包括了端点,并且再往外延伸半个线宽的长度;Qt:FlatCap表示在线条的顶点处是方形的,但线条绘制区域不包括端点在内;Qt:RoundCap表示在线条的顶点处是圆形的,且线条绘制区域包含了端点。主窗口的实现主窗口的实现(d)penJoinComboBox-addItem(tr(BevelJoin),Qt:BevelJoin):选用不同的参数,对应画笔连接点的不同风格,如图6.10所示。其中,其中,Qt:BevelJoin风格
18、连接点是指两条线的中心线顶点相汇,相连处依然保留线条各自的方形顶端;Qt:MiterJoin风格连接点是指两条线的中心线顶点相汇,相连处线条延长到线的外侧汇集至点,形成一个尖顶的连接;Qt:RoundJoin风格连接点是指两条线的中心线顶点相汇,相连处以圆弧形连接。主窗口的实现主窗口的实现(e)fillRuleComboBox-addItem(tr(Odd Even),Qt:OddEvenFill):Qt为QPainterPath类提供了两种填充规则,分别是Qt:OddEvenFill和Qt:WindingFill,如图6.11所示。其中,其中,Qt:OddEvenFill填充规则判断的依据是
19、从图形中某一点画一条水平线到图形外。若这条水平线与图形边线的交点数目为奇数,则说明此点位于图形的内部;若交点数目为偶数,则此点位于图形的外部,如图6.12所示。而Qt:WindingFill填充规则的判断依据则是从图形中某一点画一条水平线到图形外,每个交点外边线的方向可能向上,也可能向下,将这些交点数累加,方向相反的相互抵消,若最后结果不为0则说明此点在图形内,若最后结果为0则说明在图形外,如图6.13所示。主窗口的实现主窗口的实现主窗口的实现主窗口的实现(f)spreadComboBox-addItem(tr(“PadSpread”),QGradient:PadSpread):铺展效果有三种
20、,分别为QGradient:PadSpread、QGradient:RepeatSpread和QGradient:ReflectSpread。其中,PadSpread是默认的铺展效果,也是最常见的铺展效果,没有被渐变覆盖的区域填充单一的起始颜色或终止颜色;RepeatSpread效果与ReflectSpread效果只对线性渐变和圆形渐变起作用,如图6.14所示。主窗口的实现主窗口的实现(g)brushStyleComboBox-addItem(tr(SolidPattern),static_cast(Qt:Solid Pattern):选用不同的参数,对应画刷的不同风格,如图6.15所示。主窗
21、口的实现主窗口的实现ShowShape()槽函数,根据当前下拉列表框中选择的选项,调用PaintArea类的setShape()函数设置PaintArea对象的形状参数,具体代码如下:void MainWidget:ShowShape(int value)PaintArea:Shape shape=PaintArea:Shape(shapeComboBox-itemData(value,Qt:UserRole).toInt();paintArea-setShape(shape);其中,其中,QComboBox类的itemData方法返回当前显示的下拉列表框数据,是一个QVariant对象,此对
22、象与控件初始化时插入的枚举型数据相关,调用QVariant类的toInt()函数获得此数据在枚举型数据集合中的序号。主窗口的实现主窗口的实现在此函数中获得与画笔相关的所有属性值,包括画笔颜色、画笔线宽、画笔风格、画笔顶帽及画笔连接点,共同构成QPen对象,并调用PaintArea对象的setPen()函数设置PaintArea对象的画笔属性。其他与画笔参数相关的响应函数完成的工作与此类似,具体代码如下:void MainWidget:ShowPenColor()QColor color=QColorDialog:getColor(static_cast(Qt:blue);penColorFra
23、me-setPalette(QPalette(color);int value=penWidthSpinBox-value();Qt:PenStyle style=Qt:PenStyle(penStyleComboBox-itemData(penStyleComboBox-currentIndex(),Qt:UserRole).toInt();Qt:PenCapStyle cap=Qt:PenCapStyle(penCapComboBox-itemData(penCapComboBox-currentIndex(),Qt:UserRole).toInt();Qt:PenJoinStyle jo
24、in=Qt:PenJoinStyle(penJoinComboBox-itemData(penJoinComboBox-currentIndex(),Qt:UserRole).toInt();paintArea-setPen(QPen(color,value,style,cap,join);主窗口的实现主窗口的实现ShowPenWidth()槽函数的具体实现代码如下:void MainWidget:ShowPenWidth(int value)QColor color=penColorFrame-palette().color(QPalette:Window);Qt:PenStyle styl
25、e=Qt:PenStyle(penStyleComboBox-itemData(penStyleComboBox-currentIndex(),Qt:UserRole).toInt();Qt:PenCapStyle cap=Qt:PenCapStyle(penCapComboBox-itemData(penCapComboBox-currentIndex(),Qt:UserRole).toInt();Qt:PenJoinStyle join=Qt:PenJoinStyle(penJoinComboBox-itemData(penJoinComboBox-currentIndex(),Qt:Us
展开阅读全文