当前位置:网站首页>Qt窗口、视口、逻辑坐标、物理坐标

Qt窗口、视口、逻辑坐标、物理坐标

2022-06-10 03:23:00 opera321

void Widget::paintEvent(QPaintEvent *)
{
//        QPainter painter(this);
//        painter.setWindow(-50, -50, 400, 300);// Widget的默认宽高本身就是400x300,这里将窗口界面宽高分别400和300等分,因此宽高比例没变
//        painter.setBrush(Qt::green);
//        painter.drawRect(0, 0, 20, 20);// 由于宽高比例不变,所以逻辑坐标(0,0)也就是物理坐标的(50,50)

//        painter.setWindow(-50, -50, 100, 100);// 这里将宽高分别100等分,因此宽比例为4,高比例为3
//        painter.setBrush(Qt::green);
//        painter.drawRect(0, 0, 20, 20);// 由于宽高比例变了,所以逻辑坐标(0,0)也就是物理坐标的([50-0]*4,[50-0]*3)

    QPainter painter(this);
    int side = qMin(width(), height());
    int x = (width() / 2);
    int y = (height() / 2);
    // 设置视口
    painter.setViewport(x, y, side, side);// x是200,y是150,视口的物理坐标原点设置为(200,150),宽高设置为300
    painter.setWindow(0, 0, 100, 100);// 设置逻辑坐标原点即为物理坐标原点,也即在(200,150)处,宽高分别100等分,因此比例为3
    painter.setBrush(Qt::green);
    painter.drawRect(0, 0, 20, 20);// 在逻辑坐标(0,0)处,由于宽高比例变了,所以绘图的实际宽高为(20*3,20*3)

}



void Widget::paintEvent(QPaintEvent *)
{
    angle += 10;
    if(angle == 360)
        angle = 0;
    int side = qMin(width(), height());
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    QTransform transform;
    transform.translate(width()/2, height()/2);// 平移坐标系统, 将原点设置到中心处
    transform.scale(side/300.0, side/300.0);// 缩放坐标系统,side=300,所以缩放比例为1。加上缩放,绘制的图形大小会随着窗口大小的变化而变化,不加缩放,则绘制的图形大小不变。
    transform.rotate(angle);// 旋转坐标系统
    painter.setWorldTransform(transform);
    painter.drawEllipse(-120, -120, 240, 240);
    painter.drawLine(0, 0, 100, 0);
}

原网站

版权声明
本文为[opera321]所创,转载请带上原文链接,感谢
https://blog.csdn.net/dyzhen/article/details/124979616