2D绘图--视口窗口

发布时间:2024年01月11日

目录

1?setViewport?setWindow

2 示例

3 实际应用(个人理解)

4 总结


1?setViewport?setWindow

????????在Qt中,QPaintersetViewport()方法用于定义绘图区域在窗口坐标系中的可视部分。

QPainter::setWindow()?是 Qt 库中?QPainter?类的一个方法,用于定义绘图区域的大小和位置。

setViewport()setWindow()方法一起使用,以控制绘图的缩放和裁剪。

????????可以通过先设置视口,再设置对应的窗口的方法,来确保我们的代码在标准的想象中的坐标

系中绘制的图形,可以准确地显示在不同的绘图设备界面上。

2 示例
void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    int width = this->width();
    int hight = this->height();
    int view_x = width / 4;
    int view_y = hight / 4;
    int side = hight / 2;
    qDebug()<<"width:"<<width<<"hight:"<<hight;
    qDebug()<<"view_x:"<<view_x<<"view_y:"<<view_y<<"side:"<<side;
    painter.setPen(Qt::black);
    painter.drawRect(view_x,view_y,side,side);
    painter.setViewport(view_x,view_y,side,side);


    painter.setWindow(-100,-100,200,200);
    painter.setPen(Qt::red);
    QBrush brush(Qt::red);
    painter.setBrush(brush);
    painter.drawRect(0,0,100,100);
    
}

执行结果:

?代码说明:

????????打印输出

width: 400 hight: 300
view_x: 100 view_y: 75 side: 150

(1)painter.setViewport(view_x,view_y,side,side);

用于定义绘图区域的大小和位置 实际值为painter.setViewport(100,75,150,150);

????????即起点(100,75)长宽150的绘图区域?

为方便观察?painter.drawRect(view_x,view_y,side,side);绘制出了这一区域 即黑色方框

(2)painter.setWindow(-100,-100,200,200);定义你想要绘制的大小。

????????具体来说 是有一个映射关系 即点(-100,-100)与视口的(0,0)点对应就是黑色方框的左

上角,宽和长也和视口一一映射对应,有一定的比例关系

????????所以绘图时计算设置的setWindow窗口坐标就行 窗口黑色方框左上角(-100,-100),右下角(100,100)

????????此时painter.drawRect(0,0,100,100);的起始点(0,0)就对应的是窗口的中心 绘制出来如上图所示

(3)如果想在方框的右上角开始画

painter.setWindow(-200,0,200,200);

????????此时方框的右上角坐标就是(0,0)

(也可以保持painter.setWindow(-100,-100,200,200)不变,改变绘制坐标painter.drawRect(100,-100,100,100)也是一样的效果)

绘制如下

3 实际应用(个人理解)

比如代码如下

void MainWindow::paintEvent(QPaintEvent *)
{
    //我的初始窗口的大小width=400 hight=300
    QPainter painter(this);
    int width = this->width();
    int hight = this->height();

    painter.setPen(Qt::black);
    painter.drawRect(0,0,width,hight);
    painter.setViewport(0,0,width,hight);

    painter.setWindow(0,0,400,300);
    painter.setPen(Qt::red);
    QBrush brush(Qt::red);
    painter.setBrush(brush);
    painter.drawRect(0,0,200,150);

}

?

我绘制了1/4大小的红色矩形,无论窗口怎样变化,红色矩形始终占了窗口的?1/4,这里的窗口可以

模拟为设备,即在不同屏幕大小的设备上所占的比例不变。

4 总结

(1)视口定义显示区域,和setWindow窗口有一定的映射关系,设置好窗口的坐标系后,后续绘

制就按照窗口坐标系绘制即可

(2)可以通过先设置视口,再设置对应的窗口的方法,可以准确地显示在不同的绘图设备界面上。

文章来源:https://blog.csdn.net/weixin_44270564/article/details/135525721
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。