天天看點

Qt 坐标變換1.坐标變換常用接口2.示例

1.坐标變換常用接口

void translate(qreal dx,qreal dy) 平移
void rotate(qreal angle) 旋轉
void scale(qreal sx,qreal sy) 縮放
void save 儲存painter目前的狀态
void restore() 恢複上一次狀态
void resetTransform() 複位所有的坐标變換

2.示例

畫五角星

Qt 坐标變換1.坐标變換常用接口2.示例
void Widget::paintEvent(QPaintEvent *event)
{
    //建立QPainter對象,指明父對象,否則不能看見
    QPainter painter(this);

    //先畫一條線
    QPen pen;

    //設定線寬
    pen.setWidth(2);

    //設定顔色
    pen.setColor(Qt::red);

    //設定線的樣式 實線、虛線
    pen.setStyle(Qt::SolidLine);

    //設定線端點樣式
    pen.setCapStyle(Qt::FlatCap);

    pen.setJoinStyle(Qt::BevelJoin);

    //設定畫筆
    painter.setPen(pen);

    //半徑
    qreal R = 100;
    qreal pi = 3.14159;
    qreal deg = pi*72/180;

    QPoint points[5] = {
        QPoint(R,0),
        QPoint(R*std::cos(deg),-R*std::sin(deg)),
        QPoint(R*std::cos(2*deg),-R*std::sin(2*deg)),
        QPoint(R*std::cos(3*deg),-R*std::sin(3*deg)),
        QPoint(R*std::cos(4*deg),-R*std::sin(4*deg))
    };

    //設定字型
    QFont font;
    font.setPixelSize(12);
    font.setBold(true);
    painter.setFont(font);

    //設定畫刷
    QBrush brush;

    //畫刷設定顔色
    brush.setColor(Qt::yellow);

    //設定填充樣式
    brush.setStyle(Qt::SolidPattern);

    //設定畫刷
    painter.setBrush(brush);

    QPainterPath painterPath;
    painterPath.moveTo(points[0]);
    painterPath.lineTo(points[2]);
    painterPath.lineTo(points[4]);
    painterPath.lineTo(points[1]);
    painterPath.lineTo(points[3]);

    //閉合路徑,最後一個點與第一個點相連
    painterPath.closeSubpath();

    painterPath.addText(points[0],font,"0");
    painterPath.addText(points[1],font,"1");
    painterPath.addText(points[2],font,"2");
    painterPath.addText(points[3],font,"3");
    painterPath.addText(points[4],font,"4");

    //保持坐标狀态
    painter.save();

    //平移
    painter.translate(100,120);

    //畫星星
    painter.drawPath(painterPath);

    painter.drawText(0,0,"S1");

    //恢複坐标狀态
    painter.restore();

    //平移
    painter.translate(300,120);
    //縮放
    painter.scale(0.8,0.8);
    //順時針旋轉90
    painter.rotate(90);
    painter.drawPath(painterPath);
    painter.drawText(0,0,"S2");

    //複位所有坐标變換
    painter.resetTransform();
    //平移
    painter.translate(500,120);
    //逆時針旋轉145
    painter.rotate(-145);

    painter.drawPath(painterPath);
    painter.drawText(0,0,"S3");
}
           

繼續閱讀