首页 > 学院 > 开发设计 > 正文

Qt修炼手册5_图形:使用QPainter类的图形

2019-11-06 08:34:18
字体:
来源:转载
供稿:网友

1.前言

QPainter提供的API在GUI或QImage、QOpenGLPaintDevice、QWidget和QPaintDevice显示图形(线、形状、渐变等)、文本、图像。QPainter为了显示图形,利用基于软件的光栅化(raterizer)显示图形,并可以使用OpenGL和OpenGLES的Back_End系统。基于软件的光栅化通过点扫面显示到屏幕。利用QPainter绘制图形最大的好处之一就是,可以使用QpenGL Back-end。因为显示图形时,可以使用3D硬件加速器,即显卡内置的3DHW加速器,这样可以大大提升图形的绘制速度。

2.QPainter基本绘图实例

2.1 主要程序片段:

void Widget::paintEvent(QPaintEvent* event){	Q_UNUSED(event);	QPainter painter;	painter.begin(this);	painter.setPen(Qt::blue);	painter.drawLine(10, 10, 100, 40);	painter.drawRect(120, 10, 80, 80);	QRectF rect(230, 10, 80, 80);	painter.drawRoundRect(rect, 20, 20);	QPointF p1[3] = {		QPointF(10, 110),		QPointF(110.0, 110.0),		QPointF(110, 190)	};	painter.drawPolyline(p1, 3);	QPointF p2[3] = {		QPointF(120, 110.0),		QPointF(220, 110),		QPointF(220, 190)	};	painter.drawPolygon(p2, 3);	painter.setFont(QFont("Arial", 20));	painter.setPen(Qt::black);	QRect font_rect(10, 200, 320, 280);	painter.drawText(font_rect, Qt::AlignHCenter, " My Shadow is lost...");	painter.end();}

2.2 代码解释:

1.paintEvent:在GUI使用QPainter绘制图形时,可以使用重定义函数paintEvent()。串口区域要升级或重新绘制时,调用此函数成员。使用成员函数repaint()和update()后,也会调用该函数。例如,重新绘制处于覆盖状态下的窗口区域时,自动调用成员函数paintEvent().2.begin()和end()函数begin()表示开始绘制,末尾行的成员函数end()表示关闭绘图(paint)设备。函数begin()虽然没有参数,但可以明示图像或者控件。3.drawRoundRect()该函数用于绘制圆角矩形,第二个参数是指X轴斜率,第三个参数是Y轴斜率。程序输出:

2.3 Qpen

Qpen类使用QPainter绘图时,绘制线和图形轮廓的颜色、宽度、风格。一般使用规则:定义画笔(初始化颜色)-> 定义画笔宽度 -> painter对象连接画笔(setpen)。setStyle()成员函数:该函数可以指定线的风格。SolidLine 直线样式;DashLine:长虚线样式;DotLine:虚线样式等等。setCapStyle()成员函数:可以指定线的末端为平面(Flat)、方形笔帽(SquareCap)和圆形的圆角笔帽(RoundCap)。SetJointStyle()成员函数:定义了连接样式。

2.4 QBrush

用指定的颜色填充QPainter绘制的图形。同样以枚举类型进行填充。

2.5 渐变

渐变又可以指斜率,利用向量微积分学,根据增加率的大小小时斜率的向量场。

2.6 转换

QTransform类可以在QPainter界面是指扩大缩小、旋转、远近等技巧。
void Widget::paintEvent(QPaintEvent *event){    Q_UNUSED(event)    QImage image("qtblog.png"); //加载图像    QPainter painter(this);   	painter.begin(this);    painter.setPen(QPen(Qt::blue, 1, Qt::DashLine));    painter.drawRect(0, 0, 100, 100);    QTransform transform;    transform.translate(50, 50);    transform.rotate(70, Qt::YAxis);	painter.setTransform(transform); //将定义的矩阵加载进来    painter.drawImage(0, 0, image);    painter.end();}效果图:
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表