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
26、erRole).toInt();paintArea-setPen(QPen(color,value,style,cap,join);主窗口的实现主窗口的实现ShowPenStyle()槽函数的具体实现代码如下:void MainWidget:ShowPenStyle(int styleValue)QColor color=penColorFrame-palette().color(QPalette:Window);int value=penWidthSpinBox-value();Qt:PenStyle style=Qt:PenStyle(penStyleComboBox-itemData(s
27、tyleValue,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:UserRole).toInt();paintArea-setPen(QPen(color,value,style,cap,jo
28、in);主窗口的实现主窗口的实现ShowPenCap()槽函数的具体实现代码如下:void MainWidget:ShowPenCap(int capValue)QColor color=penColorFrame-palette().color(QPalette:Window);int value=penWidthSpinBox-value();Qt:PenStyle style=Qt:PenStyle(penStyleComboBox-itemData(penStyleComboBox-currentIndex(),Qt:UserRole).toInt();Qt:PenCapStyle c
29、ap=Qt:PenCapStyle(penCapComboBox-itemData(capValue,Qt:UserRole).toInt();Qt:PenJoinStyle join=Qt:PenJoinStyle(penJoinComboBox-itemData(penJoinComboBox-currentIndex(),Qt:UserRole).toInt();paintArea-setPen(QPen(color,value,style,cap,join);主窗口的实现主窗口的实现ShowPenJoin()槽函数的具体实现代码如下:void MainWidget:ShowPenJoi
30、n(int joinValue)QColor color=penColorFrame-palette().color(QPalette:Window);int value=penWidthSpinBox-value();Qt:PenStyle style=Qt:PenStyle(penStyleComboBox-itemData(penStyleComboBox-currentIndex(),Qt:UserRole).toInt();Qt:PenCapStyle cap=Qt:PenCapStyle(penCapComboBox-itemData(penCapComboBox-currentI
31、ndex(),Qt:UserRole).toInt();Qt:PenJoinStyle join=Qt:PenJoinStyle(penJoinComboBox-itemData(joinValue,Qt:UserRole).toInt();paintArea-setPen(QPen(color,value,style,cap,join);主窗口的实现主窗口的实现ShowFillRule()槽函数的具体实现代码如下:void MainWidget:ShowFillRule()Qt:FillRule rule=Qt:FillRule(fillRuleComboBox-itemData(fillR
32、uleComboBox-currentIndex(),Qt:UserRole).toInt();paintArea-setFillRule(rule);ShowSpreadStyle()槽函数的具体实现代码如下:void MainWidget:ShowSpreadStyle()spread=QGradient:Spread(spreadComboBox-itemData(spreadComboBox-currentIndex(),Qt:UserRole).toInt();主窗口的实现主窗口的实现ShowBrushColor()槽函数,与设置画笔颜色函数类似,但选定颜色后并不直接调用PaintA
33、rea对象的setBrush()函数,而是调用ShowBrush()函数设置显示区的画刷属性,具体实现代码如下:void MainWidget:ShowBrushColor()QColor color=QColorDialog:getColor(static_cast(Qt:blue);brushColorFrame-setPalette(QPalette(color);ShowBrush(brushStyleComboBox-currentIndex();ShowBrush()槽函数的具体实现代码。其中,其中,(a)Qt:BrushStyle style=Qt:BrushStyle(brus
34、hStyleComboBox-itemData(value,Qt:UserRole).toInt():获得所选的画刷风格,若选择的是渐变或者纹理图案,则需要进行一定的处理。(b)主窗口的style变量值为Qt:LinearGradientPattern时,表明选择的是线形渐变。QLinearGradient linearGradient(startPoint,endPoint)创建线形渐变类对象需要两个参数,分别表示起止点位置。(c)主窗口的style变量值为Qt:RadialGradientPattern时,表明选择的是圆形渐变。(d)主窗口的style变量值为Qt:ConicalGradi
35、entPattern时,表明选择的是锥形渐变。主窗口的实现主窗口的实现QConicalGradient conicalGradient(startPoint,-(180*angle)/PI)创建锥形渐变类对象需要两个参数,分别是锥形的顶点位置和渐变分界线与水平方向的夹角,如图6.16所示。锥形渐变不需要设置铺展效果,它的铺展效果只能是QGradient:PadSpread。主窗口的实现主窗口的实现打开“main.cpp”文件,添加如下代码:#include mainwidget.h#include#include int main(int argc,char*argv)QApplication
36、 a(argc,argv);QFont f(ZYSong18030,12);a.setFont(f);MainWidget w;w.show();return a.exec();主窗口的实现主窗口的实现运行程序,效果如图6.17所示。第第6章章 Qt 5图形与图片图形与图片Qt 5双缓冲机制双缓冲机制0101原理与设计原理与设计原理与设计原理与设计【例】(难度中等)(CH603)实现一个简单的绘图工具,可以选择线型、线宽、颜色等基本要素,如图6.18所示。QMainWindow对象作为主窗口,QToolBar对象作为工具栏,QWidget对象作为主窗口的中央窗体,也就是绘图区,如图6.19所示
37、。原理与设计原理与设计具体实现步骤如下。(1)新建Qt Widgets Application(详见1.3.1节),项目名称为“DrawWidget”,基类选择“QMainWindow”,类名命名默认为“MainWindow”,取消取消“创建界面”复选框的选中状态。单击“下一步”按钮,最后单击“完成”按钮,完成该项目工程的建立。(2)添加该工程的提供实现绘图区的函数所在的文件。在“DrawWidget”项目名上单击鼠标右键,在弹出的快捷菜单中选择“添加新文件.”选项,在弹出的对话框中选择“C+Class”选项。单击“Choose.”按钮,在弹出的对话框的“Base class”下拉列表框中选择
38、基类名“QWidget”,在“Class name”文本框中输入类的名称“DrawWidget”。(3)单击“下一步”按钮,单击“完成”按钮,添加文件“drawwidget.h”和文件“drawwidget.cpp”。0202绘图区的实现绘图区的实现绘图区的实现绘图区的实现DrawWidget类继承自QWidget类,在类声明中对鼠标事件mousePressEvent()和mouseMoveEvent()、重画事件paintEvent()、尺寸变化事件resizeEvent()进行了重定义。setStyle()、setWidth()及setColor()函数主要用于为主窗口传递各种与绘图有关的
39、参数。(1)打开“drawwidget.h”头文件,添加的代码。(2)打开“drawwidget.cpp”文件,DrawWidget构造函数完成对窗体参数及部分功能的初始化工作,具体代码如下:#include drawwidget.h#include#include DrawWidget:DrawWidget(QWidget*parent):QWidget(parent)setAutoFillBackground(true);/对窗体背景色的设置 setPalette(QPalette(Qt:white);pix=new QPixmap(size();/此QPixmap对象用于准备随时接收绘制
40、的内容 pix-fill(Qt:white);/填充背景色为白色 setMinimumSize(600,400);/设置绘制区窗体的最小尺寸绘图区的实现绘图区的实现setStyle()函数接收主窗口传来的线型风格参数,setWidth()函数接收主窗口传来的线宽参数值,setColor()函数接收主窗口传来的画笔颜色值。具体代码如下:void DrawWidget:setStyle(int s)style=s;void DrawWidget:setWidth(int w)weight=w;void DrawWidget:setColor(QColor c)color=c;重定义鼠标按下事件mo
41、usePressEvent(),在按下鼠标按键时,记录当前的鼠标位置值startPos。void DrawWidget:mousePressEvent(QMouseEvent*e)startPos=e-pos();绘图区的实现绘图区的实现QWidget的mouseTracking属性指示窗体是否追踪鼠标,默认为false(不追踪),即在至少有一个鼠标按键被按下的前提下移动鼠标才触发mouseMoveEvent()事件,可以通过setMouseTracking(bool enable)方法对该属性值进行设置。如果设置为追踪,则无论鼠标按键是否被按下,只要鼠标移动,就会触发mouseMoveEve
42、nt()事件。在此事件处理函数中,完成向QPixmap对象中绘图的工作。具体代码如下:void DrawWidget:mouseMoveEvent(QMouseEvent*e)QPainter*painter=new QPainter;/新建一个QPainter对象 QPen pen;/新建一个QPen对象 pen.setStyle(Qt:PenStyle)style);/(a)pen.setWidth(weight);/设置画笔的线宽值 pen.setColor(color);/设置画笔的颜色 painter-begin(pix);/(b)painter-setPen(pen);/将QPen
43、对象应用到绘制对象中 /绘制从startPos到鼠标当前位置的直线 painter-drawLine(startPos,e-pos();painter-end();startPos=e-pos();/更新鼠标的当前位置,为下次绘制做准备 update();/重绘绘制区窗体绘图区的实现绘图区的实现下面是使用begin()和end()函数的一个例子:void MyWidget:paintEvent(QPaintEvent*)QPainter p;p.begin(this);p.drawLine(.);p.end();类似于下面的形式:void MyWidget:paintEvent(QPaintE
44、vent*)QPainter p(this);p.drawLine(.);绘图区的实现绘图区的实现重画函数paintEvent()完成绘制区窗体的更新工作,只需调用drawPixmap()函数将用于接收图形绘制的QPixmap对象绘制在绘制区窗体控件上即可。具体代码如下:void DrawWidget:paintEvent(QPaintEvent*)QPainter painter(this);painter.drawPixmap(QPoint(0,0),*pix);调整绘制区大小函数resizeEvent(),当窗体的大小发生改变时,效果看起来虽然像是绘制区大小改变了,但实际能够进行绘制的区
45、域仍然没有改变。因为绘图的大小并没有改变,还是原来绘制区窗口的大小,所以在窗体尺寸变化时应及时调整用于绘制的QPixmap对象的大小。具体代码如下:void DrawWidget:resizeEvent(QResizeEvent*event)if(height()pix-height()|width()pix-width()/(a)QPixmap*newPix=new QPixmap(size();/创建一个新的QPixmap对象 newPix-fill(Qt:white);/填充新QPixmap对象newPix的颜色为白色背景色 QPainter p(newPix);p.drawPixmap
46、(QPoint(0,0),*pix);/在newPix中绘制原pix中的内容 pix=newPix;/将newPix赋值给pix作为新的绘制图形接收对象 QWidget:resizeEvent(event);/完成其余的工作绘图区的实现绘图区的实现clear()函数完成绘制区的清除工作,只需调用一个新的、干净的QPixmap对象来代替pix,并调用update()函数重绘即可。具体代码如下:void DrawWidget:clear()QPixmap*clearPix=new QPixmap(size();clearPix-fill(Qt:white);pix=clearPix;update(
47、);0303主窗口的实现主窗口的实现主窗口的实现主窗口的实现主窗口类MainWindow继承自QMainWindow类,只包含一个工具栏和一个中央窗体。首先,声明一个构造函数、一个用于创建工具栏的函数createToolBar()、一个用于进行选择线型风格的槽函数ShowStyle()和一个用于进行颜色选择的槽函数ShowColor()。然后,声明一个DrawWidget类对象作为主窗口的私有变量,以及声明代表线型风格、线宽选择、颜色选择及清除按钮的私有变量。(1)打开“mainwindow.h”文件,添加如下代码。主窗口的实现主窗口的实现(2)打开“mainwindow.cpp”文件,Mai
48、nWindow类的构造函数完成初始化工作,各个功能见注释说明,具体代码如下:#include mainwindow.h#include#include MainWindow:MainWindow(QWidget*parent):QMainWindow(parent)drawWidget=new DrawWidget;/新建一个DrawWidget对象 setCentralWidget(drawWidget);/新建的DrawWidget对象作为主窗口的中央窗体 createToolBar();/实现一个工具栏 setMinimumSize(600,400);/设置主窗口的最小尺寸 ShowSt
49、yle();/初始化线型,设置控件中的当前值作为初始值 drawWidget-setWidth(widthSpinBox-value();/初始化线宽 drawWidget-setColor(Qt:black);/初始化颜色createToolBar()函数完成工具栏的创建。主窗口的实现主窗口的实现改变线型参数的槽函数ShowStyle(),通过调用DrawWidget类的setStyle()函数将当前线型选择控件中的线型参数传给绘制区;设置画笔颜色的槽函数ShowColor(),通过调用DrawWidget类的setColor()函数将用户在标准颜色对话框中选择的颜色值传给绘制区。这两个函数
50、的具体代码如下:void MainWindow:ShowStyle()drawWidget-setStyle(styleComboBox-itemData(styleComboBox-currentIndex(),Qt:UserRole).toInt();void MainWindow:ShowColor()QColor color=QColorDialog:getColor(static_cast(Qt:black),this);/使用标准颜色对话框QColorDialog获得一个颜色值 if(color.isValid()/将新选择的颜色传给绘制区,用于改变画笔的颜色值 drawWidge