QPainter学习笔记——不断更新

QPainter

一、QPainter、QPaintDevice 和 QPaintEngine 构成了Qt绘制系统的基础。

QPainter:用来进行绘图操作的类。

用QPainter在绘图设备上绘图,主要是绘制一些基本的图形元素,包括点、直线、圆形、矩形、曲线、文字等,控制这些绘图元素特性的主要是QPainter的3个属性:pen、brush、font属性。

QPen:用于控制线条的颜色、宽度、线型等。
QBrush:用于设置一个区域的填充特性,可以设置填充颜色、填充方式、渐变特性等,还可以采用图片做材质填充。
QFont:用于绘制文字时,设置文字的字体样式、大小等属性。

QPaintDevice:绘图设备。是一个可以使用QPainter进行绘图的抽象的二维界面。

一般的绘图设备包括QWidget、QPixmap、QImage等。这些绘图设备为QPainter提供了一个“画布”。

QPaintEngine:给QPainter提供在不同设备上绘图的接口。由QPainter和QPainterDevice内部使用。

应用程序一般无需和QPaintEngine打交道,除非要创建自己的设备类型。

二、paintEvent事件和绘图区

QWidget类及其子类是最常用的绘图设备。从QWidget类继承的类都有paintEvent()事件,要在设备上绘图,只需重定义此事件并编写响应代码。创建一个QPainter对象获取绘图设备的接口,然后就可以在绘图设备的“画布”上绘图了。
在paintEvent()事件里绘图的基本程序的结构是:

void Widget::paintEvent(QPaintEvent *event){
	QPainter painter(this);	//创建与绘图设备关联的QPainter对象
	int W = this->width();	//绘图区宽度
	int H = this->hight();	//绘图区高度
	...						//painter在设备的窗口上画图
}

三、QPainter 相关常用属性和方法

QPainter painter(this);
//1.抗锯齿或反走样属性,默认未开启,使用setRenderHint()来设置
painter.setRenderHint(QPainter::Antialiasing);		//绘图抗锯齿
painter.setRenderHint(QPainter::TextAntialiasing);	//绘制的字体抗锯齿
//2.视口和窗口 建议结合坐标系统和坐标变化一起学习
/*视口:表示绘图设备的任意一个矩形区域的物理坐标,可以只选取物理坐标的一个矩形区域用于绘图。默认情况下,视口等于绘图设备的整个矩形区。
  窗口:与视口是同一个矩形,只不过是用逻辑坐标定义的坐标系。窗口可以直接定义矩形区的逻辑坐标范围。
  使用窗口坐标的优点是,只需按照窗口坐标定义来绘图么人不用管实际的物理坐标范围大小。当实际绘图设备大小变化时,绘制的图形会自动变化大小。
  定义视口函数,函数原型:void QPainter::setViewport(int x,int y,int width,int height);
  定义窗口函数,函数原型:void QPainter::setWindow(int x,int y,int width,int height);
*/
painter.setViewport(50,0,200,200);	//表示从绘图设备物理坐标系的起点(50,0)开始,取宽度为200,高度为200的一个矩形区域作为视口。
painter.setWindow(-50,-50,100,100);	//在上述视口所表示的矩形区域上定义一个窗口,窗口的坐标的中心在矩形中心,其窗口左上角的逻辑坐标为(-50,-50),窗口宽度为100,高度为100。
//3.绘制矩形
int W = width();
int H = heigt();
int side = qMin(W,H);
QRect rect((W-side)/2,(H-side)/2,side,side);//在宽W,高H的矩形窗口正中间绘制一个宽高都为side的正方形区域。
painter.drawRect(rect);

四、实例部分

实例1:绘制Pixmap图片

相关函数重载,列举最常见的,其他形式见Qt帮助手册:
//将给定像素图的矩形部分源绘制到绘画设备中的给定目标中。如果像素图的和矩形大小不相同,则将像素图缩放以适合矩形。
void drawPixmap(const QRectF &target, const QPixmap &pixmap, const QRectF &source);
//target:目标矩形区域
//source: 像素图中的矩形区域,称为源矩形
//官方示例代码:
QRectF target(10.0, 20.0, 80.0, 60.0);	//在画布上构建一个目标矩形区域
QRectF source(0.0, 0.0, 70.0, 40.0);	//在图片中划出一个矩形区域
QPixmap pixmap(":myPixmap.png");

QPainter(this);
painter.drawPixmap(target, pixmap, source);
//widget.h里面声明重载函数paintEvent()
class Widget : public QWidget{
	Q_OBJECT
...
	void paintEvent(QPaintEvent *event);
}
//widget.cpp里面定义实现paintEvent()
#include<QPainter>
#include<QPixmap>
#include<QRect>
...
void Widget::paintEvent(QPaintEvent *event){
	Q_UNUSED(event);
	QPainter painter(this);
	QPixmap pixmap("://image/背景图片.jpeg");
	QRect targetRect(0,0,width(),height());
	painter.drawPixmap(targetRect,pixmap);
	//painter.drawPixmap(rect(),QPixmap("://image/背景图片.jpeg),QRect());简化代码
}

实现效果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值