QPainter的位置问题

Qt的painter.drawtext位置问题
分别调用了drawtext和drawPixmap

painter.drawPixmap(itemX*widthScale/scaleImgToItem,
                                       itemY*heightScale/scaleImgToItem,
                                       m_image[i]->boundingRect().width()/backgroundItem->boundingRect().width()*pm.width(),
                                       m_image[i]->boundingRect().height()/backgroundItem->boundingRect().height()*pm.height(),
                                       m_image[i]->pixmap());


painter.drawText(itemX*widthScale/scaleImgToItem,itemY*heightScale/scaleImgToItem,texts.at(k));

输出如下

img itemX =  1141.53
img itemY =  698.182
img itemX*widthScale/scaleImgToItem =  711.971
img itemY*heightScale/scaleImgToItem =  464.487
text itemX =  1142.3
text itemY =  686.59
text itemX*widthScale/scaleImgToItem =  712.455
text itemY*heightScale/scaleImgToItem =  456.775

预览的图上的位置

img

实际出来的图上的位置

img


是什么导致我的drawtext位置偏移这么远。

新增painter设置代码

QPainter painter(&pm);
//这是图片和文字共用的

 painter.rotate(angle);
painter.setFont(font);
painter.setPen(static_cast<MyQgraphicsTextItem *>(res.at(i))->getColor()); //这三行是文字独有的设置,如果angle=0那么没有偏移,angle有任何角度就会发生偏移,之前是没有这个问题的,应该是改了背景的boundingrect出现的现在的问题。
 m_rect=QRectF(0,0,w,h);  //背景的boundingrect用这一行文字打印就有问题
 m_rect=QRectF(-w/2,-h/2,w,h);//用这一行文字就没问题,但是图片部分又会有偏移问题。

drawText 方法的偏移可能是由于应用到画家的旋转。 当您旋转 painter 时,它的坐标系也会旋转,这可能会导致文本绘制在与您预期不同的位置。

这个问题的一种解决方案是在绘制文本之前将画家的坐标系平移回其原始位置。 您可以使用 QPainter 类的翻译方法来完成此操作。 例如:

painter.translate(w / 2, h / 2);
painter.rotate(angle);
painter.translate(-w / 2, -h / 2);
painter.drawText(itemX * widthScale / scaleImgToItem, itemY * heightScale / scaleImgToItem, texts.at(k));

这样可以保证旋转后坐标系不变,文字会绘制在预期的位置。

关于drawPixmap 方法的偏移,可能是由于背景的边界矩形发生了变化。 问题似乎出在行 m_rect = QRectF(0, 0, w, h); 中,它将左上角的边界矩形设置为 (0, 0)。 这可能会导致 drawPixmap 方法的偏移。 要解决此问题,您可以将边界矩形设置为以原点为中心,就像您在行 m_rect = QRectF(-w/2, -h/2, w, h); 中所做的那样。

我是这么理解的,你可以多试几个数值测试一下。
drawPixmap这个(XwidthScale/scaleImgToItem, itemYheightScale/scaleImgToItem,)这是起始位置
而drawText你现在这个是指的矩形框的位置。如果你弄成和drawPixmap参数一样,应该是同一个位置的。

Qt的painter的drawText和drawPixmap的位置问题可以通过调整painter的坐标系统来解决。您可以在调用drawText和drawPixmap之前使用painter.translate函数来调整坐标系统的原点,从而使文本或图像绘制到正确的位置。

代码示例如下:

QPainter painter(this);
painter.translate(100,100);
painter.drawText(QPoint(0,0),"Hello World!");
painter.drawPixmap(QPoint(0,30),pixmap);

在这个代码中,我们首先使用painter.translate将坐标系统的原点移动到(100,100)。然后,我们使用drawText在(0,0)处绘制“Hello World!”,并在(0,30)处绘制图像。由于我们已经调整了坐标系统的原点,因此文本和图像将显示在正确的位置。