QT:QGraphicsScene与QGraphicsView使用render()函数渲染图片

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();
        ```
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值