QPainter偏移原点、旋转、缩放功能Demo【3】 原创 - mahuifa - 博客园
1、qt界面默认绘制坐标是从左上角为原点进行绘制的
如下图所示:
2、重新设置原点位置
利用painter.translate函数将原点位置控制到指定位置
例如:先绘制一个矩形,然后将矩形的中心点作为原点再画直线
void paintEvent(QPaintEvent*) override
{
QPainter painter(this);
QRect rect(50, 50, 100, 100);
//绘制一个矩形
painter.drawRect(rect);
//将坐标系的原点设置为矩形的中心
painter.translate(rect.center());
// 输出平移后的矩形的坐标
qDebug() << rect;
qDebug() << rect.center();
painter.drawLine(0, 0, 200, 200);
}
3、save()
和restore()
函数
在绘制复杂图形时,save()
和restore()
函数非常有用。通过保存当前状态,可以在进行一系列变换和设置后恢复到原始状态,避免因多次变换导致绘图错误
painter->save(); // 保存当前状态
transform.translate(m_point.x(), m_point.y()); // 沿着x和y坐标系移动
transform.rotate(-m_realAngle); // 绕轴逆时针旋转
transform.translate(-m_point.x(), -m_point.y()); // 返回原先的移动
painter->setTransform(transform, true); // 合并指定的变换与现在的变换
painter->setPen(pen); // 设置画笔
painter->setBrush(brush); // 设置画刷
painter->drawPolygon(polygon); // 绘制多边形
painter->restore(); // 恢复之前保存的状态
在这个示例中,首先保存QPainter的状态,然后进行一系列变换和设置,最后通过
restore()
函数恢复QPainter的原始状态
4、旋转角度
// 绕矩形的中心旋转矩形
void Widget::rotateAndPaintRect(QPainter *painter, const QRect &rect, int angle) {
QRect rotatedRect(-rect.width()/2, -rect.height()/2, rect.width(), rect.height());
int cx = rect.x() + rect.width() / 2;
int cy = rect.y() + rect.height() / 2;
painter->save();
painter->translate(cx, cy);
painter->rotate(angle);
painter->drawRect(rotatedRect);
painter->restore();
}