gpt4 book ai didi

qt - 使用窗口/视口(viewport)翻转 QPainter y 轴

转载 作者:行者123 更新时间:2023-12-04 01:33:00 27 4
gpt4 key购买 nike

我正在使用 Qt 4.7 QPainter 将一些多边形等绘制到小部件中。我希望改变坐标系,使 (0,0) 位于我的小部件的中心,并且 x/y 轴以标准的“笛卡尔”方式运行(即 y 增加“向上”并减少“向下”)。换句话说,如果你知道我的意思,我希望坐标是“数学”而不是“计算机图形”。 :-)

我正在尝试使用 setViewport() 和 setWindow() 来执行此操作,而不是自己进行数学运算,因为能够直接使用我的坐标调用绘图方法会很好。

这是我到目前为止所得到的:

// Setup coordinates
double screenWidth = width();
double screenHeight = height();

double windowWidth = 100.0;
double windowHeight = (screenHeight / screenWidth) * windowWidth;

painter.setViewport(0, 0, screenWidth, screenHeight);
painter.setWindow(-(windowWidth / 2.0), -(windowHeight / 2.0), windowWidth, windowHeight);

// Draw stuff
painter.setPen(Qt::NoPen);
painter.setBrush(Qt::blue);
painter.drawRect(-10, -10, 20, 20);

现在它工作得很好,因为它在屏幕中间绘制了一个漂亮的蓝色方 block 。问题是,我不得不说左上角是(-10, -10)。我希望能够做到 (-10, 10),因为这就是笛卡尔坐标中的情况。

我尝试使用 setWindow/setViewport 来获得这个“y 轴翻转”,但无济于事。这似乎是一件非常容易/基本的事情,但是在搜索了 Qt 文档和网络之后,我无法弄清楚!

谢谢,
克里斯

最佳答案

使用类QMatrix .它指定二维变换。 QMatrix设置为 QPainter .

但是请记住,在您的情况下,如果您将小部件的坐标转换为笛卡尔坐标,则必须将第一个点放在 (-10,-10) (不是在 (-10,10) 正如你提到的那样)绘制一个中心在 的矩形(0,0) ,因为 Y 轴现在长大了,X 轴现在向右长大。

您所需要的只是以这种方式转换您的坐标系统:

  • 翻译来源 (0,0) 到小部件的中间:
    alt text
  • 通过 缩放 Y 轴-1 因素:
    alt text

  • 这是代码,输入 paintEvent()小部件的功能:
    QPainter pn( this );

    int w_2 = width() / 2;
    int h_2 = height() / 2;

    { // X- and Y-Axis drawing
    pn.setPen( Qt::blue );
    pn.drawLine( 0, h_2, width(), h_2); // X-Axis
    pn.drawLine( w_2, 0 , w_2, height() ); // Y-Axis
    }

    QMatrix m;
    m.translate( w_2, h_2 );
    m.scale( 1, -1 );

    pn.setMatrix( m );
    pn.setPen( Qt::NoPen );
    pn.setBrush( QBrush( Qt::blue, Qt::Dense4Pattern ) );
    pn.drawRect( -10, -10, 20, 20 );

    结果:
    alt text

    2014 年 4 月 7 日更新

    这个问题很久以前就被问过了,从那以后很多事情都发生了变化。对于今天(2014 年初)问自己同样问题的人,我个人的回答是,从 Qt 4.3 开始,可以更轻松地解决文本翻转问题。

    你说的对。文本也会被翻转,因为它是用同一个画家绘制的。如果可能的话,您可以在所有翻转的图纸都完成​​后在最后绘制文本。由于文本位置的新计算,这种方法不方便。您还需要删除画家的设置。
    现在我建议你使用 QGraphicsView ,因为对 2D 绘画的巨大支持。对于每个 QGraphicsItem ItemIgnoresTransformations可以设置标志,这允许它忽略继承的转换(即,它的位置仍然锚定到其父级,但忽略父级或 View 旋转、缩放或剪切转换)。这个标志对于保持文本标签项水平和未缩放很有用,因此如果图形 View 被转换,它们仍然是可读的

    关于qt - 使用窗口/视口(viewport)翻转 QPainter y 轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4413570/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com