Qt中2D绘制系统

目录

一、Qt绘制系统

1.1Qt绘制基本概念

1.2 绘制代码举例

1.3画家

1.3.1 QPainter的工作原理:

1.3.2 自定义绘制饼状图:

1.4画笔和画刷

1.4.1画笔

1.4.2 画刷填充样式

1.5 反走样和渐变

1.6绘制设备

1.7坐标变换

1.8QPainterPath

1.9绘制文字

1.10QMovie

二、图形视图框架的结构


一、Qt绘制系统

1.1Qt绘制基本概念

        Qt 的绘图系统允许使用相同的 API 在屏幕和打印设备上进行绘制。整个绘图系统基于 QPainter,QPainterDevice 和 QPaintEngine 三个类。

        QPainter 用来执行绘制的操作;QPaintDevice 是一个二维空间的抽象,这个二维空间可以由QPainter 在上面进行绘制;QPaintEngine 提供了画笔 painter 在不同的设备上进行绘制的统一的接口。QPaintEngine 类用在 QPainter 和 QPaintDevice 之间,并且通常对开发人员是透明的,除非你需要自定义一个设备,这时候你就必须重新定义 QPaintEngine 了

        Qt 的绘图系统实际上是说,使用 QPainter 使用画笔画刷等工具在 QPainterDevice 上面进行绘制,它们之间使用 QPaintEngine 引擎进行通讯。

1.2 绘制代码举例

        Qt 绘图系统提供了三个主要的参数设置,画笔(pen)、画刷(brush)和字体(font)。

//QPainter 接收一个 QPaintDevice*类型的参数。
//QPaintDevice 有很多子类,比如 QImage,以及QWidget。
//我们希望在这个 widget上画,因此传入的是 this 指针。
void QMyWidget::paintEvent(QPaintEvent *event)
{
	QPainter painter(this);
	painter.drawLine(0, 0, 100, 50);
	painter.setPen(Qt::red);
	painter.drawRect(10, 10, 80, 40);
	painter.setPen(QPen(Qt::green, 5));
	painter.setBrush(Qt::blue);
	painter.drawEllipse(10, 10, 80, 40);


    //反走样 可以处理毛边效果 但是该算法复杂,不会默认开启,若要像素操作则不能开启这个
	painter.setRenderHint(QPainter::Antialiasing, true);
	//渐变是绘图中很常见的一种功能,可以把几种颜色混合在一起,自然地过渡,而不是一下子变成另一种颜色。
	//渐变一般是用在填充里面的,所以渐变的设置就是在 QBrush 里面。
	//Qt 提供了三种渐变画刷,分别是线性渐变(QLinearGradient)、辐射渐变(QRadialGradient)、角度渐变(QConicalGradient)。
	QLinearGradient linearGradient(10, 50, 90, 90);//起点xy 终点xy
	linearGradient.setColorAt(0.2, Qt::white);//渐变1/5处设置白色
	linearGradient.setColorAt(0.6, Qt::green);//3/5处设置绿色
	linearGradient.setColorAt(0.8, Qt::red);//4/5处设置绿色
	linearGradient.setColorAt(1.0, Qt::black);//终点设置黑色
	painter.setBrush(QBrush(linearGradient));
	painter.drawEllipse(10, 50, 80, 40);
	painter.setPen(QPen(QBrush(linearGradient), 10));//线条渐变
	painter.drawLine(10, 50, 90, 90);
	//角度渐变
	//QPainter的画刷、画笔、填充、渐变、坐标等属性记录在状态机中
	//当前改动后便会使用当前属性 改变画刷,坐标后只影响改动后
	int r = 60;
	QConicalGradient conicalGradient(0, 0, 0);//角度渐变的起始点 0,0 起始角度 0
	conicalGradient.setColorAt(0.0, Qt::red); 
	conicalGradient.setColorAt(60.0 / 360.0, Qt::yellow); 
	conicalGradient.setColorAt(120.0 / 360.0, Qt::green); 
	conicalGradient.setColorAt(180.0 / 360.0, Qt::cyan); 
	conicalGradient.setColorAt(240.0 / 360.0, Qt::blue); 
	conicalGradient.setColorAt(300.0 / 360.0, Qt::magenta); 
	conicalGradient.setColorAt(1.0, Qt::red);//角度回到起始 red
	painter.setBrush(QBrush(conicalGradient));
	painter.setPen(QPen(QBrush(conicalGradient),5));
	painter.translate(90+r, r+10);//修改坐标原点00到r,r
	painter.drawEllipse(QPoint(0, 0),r, r);
	//修改坐标 状态机恢复
	painter.fillRect(10, 10, 50, 100, Qt::red); 
	painter.save(); //保持当前状态
	painter.translate(100, 0); // 向右平移 100px 
	painter.fillRect(10, 10, 50, 100, Qt::yellow); 
	painter.restore();//绘制完之后在恢复之前状态
	painter.save(); 
	painter.translate(300, 0); // 向右平移 300px 
	painter.rotate(30); // 顺时针旋转 30 度 
	painter.fillRect(10, 10, 50, 100, Qt::green); 
	painter.restore();
	painter.save();
	painter.translate(400, 0); // 向右平移 400px 
	painter.scale(2, 3); // 横坐标单位放大 2 倍,纵坐标放大 3 倍 
	painter.fillRect(10, 10, 50, 100, Qt::blue); 
	painter.restore(); 
	painter.save();
	painter.translate(600, 0); // 向右平移 600px 
	painter.shear(0, 1); // 横向不变,纵向扭曲 1 倍 
	painter.fillRect(10, 10, 50, 100, Qt::cyan); 
	painter.restore();

	//不同的绘图设备
	//绘图设备是指继承 QPainterDevice 的子类。Qt 一共提供了四个这样的类,分别是 QPixmap、QBitmap、QImage 和 QPicture。
}

1.3画家

1.3.1 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值