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();```