目录
一、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。
}