在Qt图像开发过程中,经常会遇到这样的一些问题,需要对一些图像进行平时和旋转等。
所以经常会用到以下的几个函数:
QTransform & QTransform::rotate(qreal angle, Qt::Axis axis = Qt::ZAxis)
void QPainter::translate(const QPointF & offset)
void QPainterPath::moveTo(const QPointF & point)
都是用来惊醒平移和旋转的函数。
首先是 rotate(45); 表示旋转45度
translate:
在qt中默认的坐标系是以(0,0)点坐标中心点的,所以当你对某个点进行旋转的时候就需要用到translate函数了
translate(100 ,100);表示使用100,100作为中心点,然后在进行旋转的话,就是以100,100做为中心点进行旋转了。
下面就以书上的代码为例子:
QTransform transform;
transform.translate(50, 50); //把中心点移动到 50,50
translate.rotate(45); //旋转45度
translate.translate(-50 ,-50);//把中心点设置回默认的位置
painter.drawText(QPointF(50, 50 ),"draw text in 45 dgree");在50,50点的地方绘制45度的文字
然后就是使用这个的一些细节了。
painter.save();
//上面的绘图代码
painter.restore();
这两句代码的作用就是 先保存painter的状态,在绘制完这段后恢复以前的状态。
下面给出程序的demo
void MainWindow::paintEvent(QPaintEvent* event)
{
QPainter painter(this);
// painter.drawText(QPointF(50 , 50),"sdafsdfsd");
// painter.translate(500,500);
// painter.save();
// painter.rotate(50);
// painter.drawLine(0 ,-50 , 0 , -200);
// painter.restore();
// painter.drawLine(0 ,-50 , 0 , -200);
// QVector shipVec;
// shipVec.push_back(QPoint(shipWidth/2,refSpeed));
// shipVec.push_back(QPoint(offsetXY,shipHeight+refSpeed-offsetXY));
// shipVec.push_back(QPoint(shipWidth-offsetXY,shipHeight+refSpeed-offsetXY));
// QPolygon shipPolygon(shipVec);
// shipPainter.drawPolygon(shipPolygon);
QVector shipVec;
shipVec.push_back(QPointF(100+0.0,100+0.0));
shipVec.push_back(QPointF(100+9.0 ,100+ 27.0));
shipVec.push_back(QPointF(100-8.0 ,100+ 27.0));
painter.save();
QTransform trans;
trans.translate(100 ,100);
trans.rotate(45);
trans.translate(-100 ,-100);
painter.setWorldTransform(trans);
// painter.drawPolygon();
painter.drawPolygon(shipVec);
painter.restore();
painter.drawLine(QPointF(100 ,100) , QPointF(150,50));
}
这次学到的东西同时也解决了我上次遇到的绘制警告动画和地图位置不准确的问题