QT 绘图函数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8-1 用QPainter绘图(Painting with QPainter)
2011-10-26 19:56:04| 分类:默认分类| 标签:|字号大中小订阅
8-1 用QPainter绘图(Painting with QPainter)
分类:C++ GUI Programming with Qt 4 2007-05-29 21:52 8228人阅读评论(3) 收藏举报
要在绘图设备(paint device,一般是一个控件)上开始绘制,我们只要创建一个QPainter,把绘图设备指针传给QPainter对象。例如:
oid MyWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
...
}
使用QPainter的draw…()函数我们可以绘制各种图形。图8.1给出了主要的一些。绘制的方式由QPainter的设置决定。设置的一部分是从绘图设备得到的,其他是初始化时的默认值。三个主要的设置为:画笔,刷子和字体。
画笔用来绘制直线和图形的边框。包含颜色,宽度,线型,角设置和连接设置。刷子是填充几何图形的方式。包含颜色,方式设置,也可以是一个位图或者渐变色。
字体用来绘制文本。字体的属性很多,如字体名,字号等。
这些设置随时可以改变,可用QPen,QBrush,QFont对象调用setPen(),setBrush(),setFont()修改。
Figure 8.1. QPainter's most frequently used draw...() functions
Figure 8.2. Cap and join styles
< XMLNAMESPACE PREFIX ="O" />
< XMLNAMESPACE PREFIX ="V" /> Figure 8.3. Pen styles
Figure 8.4. Predefined brush styles
现在来看看具体的例子。下面的代码是绘制图8.5(a)中椭圆的代码:QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setPen(QPen(Qt::black, 12, Qt::DashDotLine, Qt::RoundCap)); painter.setBrush(QBrush(Qt::green, Qt::SolidPattern));
painter.drawEllipse(80, 80, 400, 240);
调用函数setRenderHint(QPainter::Antialiasing,true),使绘制时边缘平滑,使用颜色浓度的变化,把图形的边缘转换为象素时引起的扭曲变形尽可能减少,在支持这一功能的平台或者绘图设备上得到一个平滑的边缘。
Figure 8.5. Geometric shape examples
下面的代码是图8.5(b)中绘制扇形的代码:
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setPen(QPen(Qt::black, 15, Qt::SolidLine, Qt::RoundCap,
Qt::MiterJoin));
painter.setBrush(QBrush(Qt::blue, Qt::DiagCrossPattern));
painter.drawPie(80, 80, 400, 240, 60 * 16, 270 * 16);
函数drawPie()的最后两个参数值的单位为一度的十六分之一。
下面的代码是图8.5(c)中绘制贝赛尔曲线的代码:
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
QPainterPath path;
path.moveTo(80, 320);
path.cubicTo(200, 80, 320, 80, 480, 320);
painter.setPen(QPen(Qt::black, 8));
painter.drawPath(path);
通过连接基本图形元素,直线,椭圆,多段线,圆弧,二次和三次贝塞尔曲线等,QPainterPath类能确定任何矢量图形。因此,绘图路径(Painter paths)是最
基本的绘制元素,任何图形和图形的组合都可以同路径(path)表示。
一个路径能够确定一个轮廓,由这个轮廓确定的区域可以由刷子来填充。在图8.5(c)中我们没有设置刷子,因此只绘制了轮廓。
以上的三个例子都是使用了默认的刷子(Qt::SolidePattern,
Qt::DiagCrossPattern,Qt::NoBrush)。在现在的应用程序中,单色填充已经很少使用,渐变色填充开始收到欢迎。渐变是依靠颜色的变化实现两种或者多种颜色之间平滑的过渡。渐变通常用来处理3D效果,如使用Plastique渐变方式来
表现QPushButtons。
Qt支持三种类型的渐变:线形渐变,圆锥渐变和圆形渐变(linear, conical, and radial)。下一节的OvenTimer例子就是在一个控件中使用了所有这三种渐变。
线形渐变由两个控制点和直线上的一系列颜色点组成。图8.6由下面的代码得到:在两个控制点之间,在三个不同的位置确定了三个不同的颜色值。位置有0到1的浮点数得到,0为第一个控制点,1为第二个控制点。不同位置点之间的颜色由差值计算得到。
LinearGradient gradient(50, 100, 300, 350);
gradient.setColorAt(0.0, Qt::white);
gradient.setColorAt(0.2, Qt::green);
gradient.setColorAt(1.0, Qt::black);
Figure 8.6. QPainter's gradient brushes