第八章 二维图形 - QPainter

    前面大多学的是控件用户界面的安排学习,现在是Qt一个极其重要的方面,就是在绘制二维图形方面的强大功能,在使用得当情况下绝大部分你需要的界面和图形都能非常好看,也有很多自带的的和第三方图形库能够使用,会比手动绘制方便的多,就看你用的溜不溜了。

    Qt的二维图形引擎是基于QPainter类的。QPainter既可以绘制几何形状也可以绘制像素文字等元素。还支持一些高级特性,反走样、像素混合、渐变填充、矢量路径之类的,还有线性变换、平移旋转什么的,可谓老牛逼了。

    重新实现QWidget::painterEvent()可以用于定制窗口部件,并且相当随便的控制外观。Qt也有QGraphicsView、QGraphicsScene和QGraphicsItem类引用全新的“图形视图”体系。可以供交互、绘制、操作。QpenGL是一个绘制三维图形的标准库,也很厉害,以后详述。

一、使用QPainter绘图

    要想在绘图设备上(一般指的是窗口部件)上绘图,只需要创建一个QPainter,再将指针传到该设备中。

例如:

void MyWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
}

QPainter的drawXXX()函数可以绘制各种形状,当然前提是设置好工具的属性。

查看Qt助手对这些绘图的理解帮助会非常大。


QPainter可以这样用:

void Widget:: draw()
{
    QPainter painter( this );
    painter. setPen( QPen ( Qt :: black, 10 , Qt :: DashDotLine, Qt :: RoundCap));
    painter. setBrush( QBrush ( Qt :: green, Qt :: SolidPattern));
    painter. drawEllipse( 10 , 10 , 400 , 240 );
    painter. drawRect( QRect ( 10 , 300 , 400 , 140 ));
}
可以这样用嘞:

void Widget:: drawBezier()
{
    QPainter painter( this );
painter. setRenderHint( QPainter :: Antialiasing, true );
 
    QPainterPath path;
    path. moveTo( 10 , 320 );
path. cubicTo( 200 , 80 , 400 , 80 , 480 , 320 );
 
    painter. setPen( QPen ( Qt :: black, 2 ));
painter. drawPath( path);
 
    painter. setPen( QPen ( Qt :: red, 4 ));
    painter. drawPoint( 10 , 320 );
     painter. drawPoint( 200 , 80 );
    painter. drawPoint( 400 , 80 );
    painter. drawPoint( 480 , 320 );
}

下面做一个QPainter的实例,一个改变绘图的控制器,当然是不完善的。
#include "painterarea.h"

#ifndef PAINTAREA_H
#define PAINTAREA_H
#include <QWidget>
#include <QPen>
#include <QPaintEvent>
class PaintArea : public QWidget
{
	Q_OBJECT
public:
	enum Shape 
	{
		Line, Rectangle, RoundRect, Ellipse, Polygon, Polyline, Points, Arc, Path, Text,
		Pixmap
	};
	PaintArea(QWidget * parent = 0);
	void setShape(Shape);       //设置形状
	void setPen(QPen);          //设置画笔
	void setBrush(QBrush);      //设置画刷
	void setFillRule(Qt::FillRule);//设置填充模式
	void paintEvent(QPaintEvent *);//重画事件
private:
	Shape shape;
	QPen pen;
	QBrush brush;
	Qt::FillRule fillRule;
};
#endif // PAINTAREA_H

painterarea.cpp

#include "painterarea.h"
#include <QPainter>

PaintArea::PaintArea(QWidget *parent)
	:QWidget(parent)
{
	setPalette(QPalette(Qt::white)); //设置背景颜色
	setAutoFillBackground(true);//设置自动填充背景色
	setMinimumSize(400, 400);//设置窗口最下大小
}
void PaintArea::setShape(Shape s)   //update()更新窗口部件
{
	shape = s;
	update();
}
void PaintArea::setPen(QPen p)
{
	pen = p;
	update();
}
void PaintArea::setBrush(QBrush b)
{
	brush = b;
	update();
}
void PaintArea::setFillRule(Qt::FillRule rule)
{
	fillRule = rule;
	update();
}
//重画事件
void PaintArea::paintEvent(QPaintEvent *)
{
	QPainter p(this);
	p.setPen(pen);
	p.setBrush(brush);
	QRect rect(100, 100, 250, 200);//构造一个矩形
	static const QPoint points[4] = 
	{
		QPoint(100,100),
		QPoint(200,150),
		QPoint(300,250),
		QPoint(150,300)
	};//确定Points的四个点的坐标
	int startAngle = 60 * 16;
	int spanAngle = 180 * 16;  //为绘制曲线设置参数变量
	QPainterPath path;     //QPainterPath为Qpainter类提供了一个存储容器,里面包含了画的内容和画的顺序
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值