QPainter用setWindow转换后文字镜像了

weixin_37700863 2020-09-12 03:21:04
用setWindow转换之前的原点坐标是左上角,用setWindow和setViewport转换后的原点坐标在左下角了。
这样就跟数学上的坐标系一样了。
问题来了,转换后文字镜像了,这个怎么解决呢?
...全文
10444 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lightmainCS 2021-07-12
  • 打赏
  • 举报
回复

你的这个坐标系的转换等于是把整个坐标系沿x轴翻转。在用pixmap输出图像的时候你应该也会遇到这种情况。

解决方法是,写一个函数,输出图像和文字的时候把改变坐标系原点,把坐标系翻转,输出文字和图像之后再翻转回来,并把原点还原。

HoweHoweHowe 2020-12-29
  • 打赏
  • 举报
回复
我的做法是这样的,楼主参考下,不知道对不对。 1.调用setWindow设置为数学坐标系,然后画图; 2.需要写文字的时候,调用setWindow恢复坐标系初始状态,并写入文字(为了文字坐标与上面数学坐标对应,drawText的坐标需要简单处理下) 3.需要绘图时,再次调用setWindow设置为数学坐标系; 贴一下简单的代码


inline void SetMathCoordinate(Dialog* dialog,QPainter* painter){
    //转换为数学坐标系
    painter->setWindow(-0.5*dialog->width(), 0.5*dialog->height(),  1*dialog->width(), -1 * dialog->height());
}

inline void ResetDefaultCoordinate(Dialog* dialog,QPainter* painter){
    //恢复默认坐标系
    painter->setWindow(0, 0,  dialog->width(), dialog->height());
}

//数学坐标系,但书写文字时候需要重置调用setwindow
void Dialog::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)//去除event未使用的告警
    QPainter painter(this);
    QPen pen;

    pen.setColor(Qt::black);
    pen.setStyle(Qt::SolidLine);
    pen.setWidthF(2);
    painter.setPen(pen);



    //转换为数学坐标系,原点为屏幕正中间
    SetMathCoordinate(this,&painter);



    //画一个正方形
    QPolygon polygon;
    polygon << QPoint(0,0) << QPoint(0,100);
    polygon << QPoint(100,100) << QPoint(100,0);
    painter.drawPolygon(polygon);

    //画一个正方形
    QPolygon polygon1;
    polygon1 << QPoint(0,0) << QPoint(0,-100);
    polygon1 << QPoint(100,-100) << QPoint(100,0);
    painter.drawPolygon(polygon1);

    //画一个正方形
    QPolygon polygon2;
    polygon2 << QPoint(0,0) << QPoint(0,-100);
    polygon2 << QPoint(-100,-100) << QPoint(-100,0);
    painter.drawPolygon(polygon2);

    //画一个正方形
    QPolygon polygon3;
    polygon3 << QPoint(0,0) << QPoint(-100,0);
    polygon3 << QPoint(-100,100) << QPoint(0,100);
    painter.drawPolygon(polygon3);

    //恢复坐标系,使文字正常显示
    ResetDefaultCoordinate(this,&painter);
    //注意drawText的x,y参数,比如"hello world"的位置为(x1:100,y1:100)
    //则x = 0.5*width() + x1 = 0.5*width()+100;
    //则y = 0.5*height() - y1 = 0.5*height()-100;
    painter.drawText(0.5*width()+100,0.5*height()-100,"hello world");


    //恢复数学坐标系
    SetMathCoordinate(this,&painter);


    //可以显示
    //画一个三角形
    QPolygon polygon4;
    polygon4 << QPoint(0,0) << QPoint(50,50);
    polygon4 << QPoint(50,0) << QPoint(0,0);
    painter.drawPolygon(polygon4);


}
weixin_37700863 2020-09-13
  • 打赏
  • 举报
回复
你这种方法也能实现,但我先画到qpixmap,在把qpixmap画到qpainter上,这样就要先在qpainter上用painter.setWindow(0, height(), width(), -1* (height()) )把坐标设置到左下角,在qpixmap上画时,还要用这种方法设置一次才行。那还要其它好的方法吗
Italink 2020-09-12
  • 打赏
  • 举报
回复
这个解决不了吧。刚刚直接用painter调了一下,也是不行的,大多数GUI框架都把左上角作为起点了,转换需要翻转y轴,绘图是根据坐标系的,因此文字也被上下翻转了。其实比较简单的方法就是你在编程的时候把纵坐标y替换为(图表高度-y)就行了

    QPainter painter(this);
    painter.translate(0,height());
    painter.scale(1,-1);
    painter.drawText(rect(),Qt::AlignCenter,"123456");

16,203

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧