render()函数看官方文档,会有很多不懂得地方,以下为实践出来的效果。
- 当我们想要用QPaint() 绘制我们在QGraphicsView看到的部分时,不仅要绘制正确的图片大小,还需要使用 render() 渲染正确的大小。
- 当我们只想要绘制坐标系中矩形的时,图片的宽高即为view的矩形与sence的矩形相交部分,使用intersected() 函数即可实现。渲染使用 render() 函数同时也要处理四种情况,部分代码如下,有详细解释
//view的矩形,我们看到的整块区域 (坐标系内的所有内容)
QRectF viewRect = p_CanvasViewDefaultImpl->rect();
//sence的矩形(红色矩形)
QRectF senceRect = QRectF(0, 0, p_CanvasViewDefaultImpl->sceneRect().width() * data->scale(),
p_CanvasViewDefaultImpl->sceneRect().height() * data->scale());
//俩个区域的交集,我们想要绘制真正的区域(坐标系内的红色矩形)
QRectF result = viewRect.intersected(senceRect);
//获取sence的坐标
auto asc = p_CanvasViewDefaultImpl->mapFromScene(0, 0);
//图片大小
QPixmap pi(result.width(), result.height());
pix = pi;
QPainter painter /*(&pix)*/;
//开始绘制图片
painter.begin(&pix);
//绘制抗锯齿效果
painter.setRenderHint(QPainter::HighQualityAntialiasing);
//render()第一个与第四个参数简单不说,第二个参数为要绘制的区域,第三参数为从哪里绘制来的区域
if (asc.x() < 0 && asc.y() < 0) { //渲染时要分四种情况 皆为放大效果,sence坐标x,y都为负数,此时直接使用view的坐标起始点(0,0)
p_CanvasViewDefaultImpl->render(&painter, QRectF(), QRect(0, 0, result.width(), result.height()));
} else if (asc.x() > 0 && asc.y() < 0) { //sence的坐标为正就用,sence的坐标,自行理会
p_CanvasViewDefaultImpl->render(&painter, QRectF(), QRect(asc.x(), 0, result.width(), result.height()));
} else if (asc.x() < 0 && asc.y() > 0) {
p_CanvasViewDefaultImpl->render(&painter, QRectF(), QRect(0, asc.y(), result.width(), result.height()));
} else {
p_CanvasViewDefaultImpl->render(&painter, QRectF(),
QRect(asc.x(), asc.y(), result.width(), result.height()));
}
painter.end();
```