QPainter
目录
/*绘制图形*/ draw
/*图形渲染提示*/ setRenderHint
/*渐变渲染*/ Gradient
paintEvent是QT的基类函数,用于响应窗口系统发出的重绘请求,每当一个窗口部件需要更新其显示内容时,例如窗口首次显示、部分窗口从被遮挡变为可见、或者你显式地调用了update()或repaint()函数,Qt会自动调用这个方法。
前置用法:
protected:
void paintEvent(QPaintEvent* event) override;
基本方法:
void MainWindow::paintEvent( QPaintEvent* event)
QPainter painter(this);//绑定部件
painter.setPen(Qt::red); // 设置画笔颜色为红色,即图形的边框颜色
painter.setBrush(Qt::yellow); // 设置画刷颜色为黄色,即图形内部颜色
/*绘制图形*/ draw
//绘制一个矩形 (x,y,宽度,高度)
painter.drawRect(10, 10, 100, 100);
//绘制一个椭圆(x,y,内切于100,100的矩形)
painter.drawEllipse(10, 10, 100, 100);
//绘制一条直线
painter.drawLine(int x1, int y1, int x2,int y2);
//绘制一个扇形
painter.drawPie(QRect(x1, y1, width, heigth),angle1 * 16, angle2 * 16);//内切矩形,angle1开始角度,angle2跨越角度,开始角度以1/16度为单位
//绘制一个点
painter.drawPoint(int x, int y)
//绘制一个多边形,使用给定点集绘制一个多边形,并根据指定的填充规则来决定如何填充内部区域。
painter.drawPolygon(const QPolygon &polygon, Qt::FillRule)
示例:
QPolygon polygon;
polygon << QPoint(100, 100)
<< QPoint(150, 50)
<< QPoint(200, 100)
<< QPoint(175, 150)
<< QPoint(125, 150);//或者用append(),这是一个五边形
默认使用 OddEvenFill 规则,或者指定使用 WindingFill 规则
painter.drawPolygon(polygon); //painter.drawPolygon(polygon, Qt::WindingFill);
//绘制一条折线
painter.drawPolyline(const QPolygon &polyline)
//绘制文本
painter.drawText(int x, int y, const QString &text)
/*图形渲染提示*/ setRenderHint
//设置渲染提示,告诉绘图系统如何处理某些类型的图形操作
painter.setRenderHint(QPainter::RenderHint hint, bool on = true)
1、
//启用抗锯齿
painter.setRenderHint(QPainter::Antialiasing)
//文本抗锯齿
painter.setRenderHint(QPainter::TextAntialiasing)
高品质抗锯齿
painter.setRenderHint(QPainter::HighQuantityAntialiasing)
2、
//旋转、缩放平滑,注重质量
painter.setRenderHint(QPainter::SmoothPixmapTransform)
//注重转化速度
painter.setRenderHint(Qt::FastTransformation)
3、针对画笔线条宽度,根据图形缩放程度自动调整
painter.setRenderHint(QPainter::NonCosmeticDefaultPen)
4、//避免渲染过程中失真
painter.setRenderHint(Qt::LosslessImageRendering)
5、//提高绘制效率,前提是内容非透明
painter.setRenderHint(Qt::OpaquePaintEvent)
也可以用painter.setRenderHints(QPainter::A |QPainter::B....)来组合多个提示
/*渐变渲染*/ Gradient
1、线性 QLinearGradient(起点到终点渐变)
//线性渐变
QLinearGradient linearGradient(x1, y1, x2, y2); // 渐变生效域 起点(x1, y1) 终点(x2, y2)
// 设置颜色停靠点
linearGradient.setColorAt(0.0, Qt::red); // 起点颜色
linearGradient.setColorAt(0.5, Qt::green); //中点颜色
linearGradient.setColorAt(1.0, Qt::blue); // 终点颜色
//创建渐变画刷
QBrush brush(linearGradient);
//绘图
QPainter painter(this);
painter.setBrush(brush);
painter.setPen(Qt::NoPen); // 无边框
painter.drawRect(this->rect()); // 绘制矩形覆盖整个小部件
2、径向 QRadialGradient
(焦点向外渐变)
//径向渐变
QRadialGradient radialGradient(x, y, radial);//渐变生效域 中心坐标,半径
radialGradient.setFocalPoint(80, 80);//焦点,即渐变的中点,但不影响原始图象域的方位
radialGradient.setColorAt(0, Qt::black);
radialGradient.setColorAt(1, Qt::red);
QBrush brushRadial(radialGradient);
QPainter painter(this);
painter.setBrush(brushRadial);
painter.setPen(Qt::NoPen);
painter.drawRect(this->rect());
3、圆锥形 QConicalGradient(根据角度旋转渐变)
//圆锥形渐变
QConicalGradient conicalGradient(x,y,angle);//中心点,开始角度(0-360°,顺时针)
conicalGradient.setColorAt(0.0, Qt::red);
conicalGradient.setColorAt(0.5, Qt::blue);
conicalGradient.setColorAt(1.0, Qt::yellow);
QBrush brushConical(conicalGradient);
QPainter painter(this);
painter.setBrush(brushConical);
painter.setPen(Qt::NoPen);
painter.drawRect(this->rect());