(Qt)正确清晰的显示SVG图案到Label中显示以及Painter画清晰的SVG

本文探讨了在Qt应用中如何通过QSvgRenderer处理DPI变化,重点关注了利用SVG解决贴图模糊问题的三种方法:样式表设置、QLabel上绘制SVG和Painter中画SVG。通过调整大小和设置DevicePixelRatio确保跨DPI设备的适配性。
摘要由CSDN通过智能技术生成

首先,客户端的适配免不了处理DPI的一系列问题,Qt-Dpi的适配方案研究可以参考我的另外一篇博文(在项目中我的DPI处理方案,链接之后发)。Dpi的不同会导致普通格式的贴图会模糊,而SVG的出现可以更好的解决这个问题,Qt对SVG的解析和支持主要使用了QSvgRenderer这个类。

目前使用SVG有三个方法:

1.样式表设置image:url(xxx.svg),这里不要用border-image和background-image。

2.将SVG加工成Pixmap,贴到Label上去

3.在Painter中画SVG加工好的Pixmap

第一种方法在dpi改变的情况下能自动适配,而2.3两种方法只能一次性画好,下面重点说下2.3两种方法:

第二种方法:在QLabel上画SVG

代码如下列所示,其中容器大小为所需要svg呈现的大小,而且必须乘以DPI的系数。

        QString svg_path = QSvgRenderer svg_remder (folder_icon_path);
        QSize label_size = ui->label->size(); //取控件的大小即可
        QImage image(QSize(label_size .width()* g_fGlobalDPI, label_size .height()* g_fGlobalDPI), QImage::Format_ARGB32_Premultiplied); 输出的img一定要是拉伸dpi倍数之后尺寸
        img.fill(Qt::transparent);
        QPainter painter(&image);
        painter.setRenderHints(QPainter::Antialiasing|QPainter::TextAntialiasing| QPainter::SmoothPixmapTransform);
        svg_remder.render(&painter);
        QPixmap pix;
        pix=pix.fromImage(image);
        pix.setDevicePixelRatio(g_fGlobalDPI);//设置pixmap伸缩比例

第三种方法:在Painter中画SVG

其实和上面类似,都是得到相应的合理的pixmap,之后直接用painer绘画即可。最后利用这个pixmap在对应控件的painter->drawpixmap()即可。

        QString svg_path = QSvgRenderer svg_remder (folder_icon_path);
        QSize label_size = ui->label->size(); //取控件的大小即可
        QImage image(QSize(label_size .width()* g_fGlobalDPI, label_size .height()* g_fGlobalDPI), QImage::Format_ARGB32_Premultiplied); 输出的img一定要是拉伸dpi倍数之后尺寸
        img.fill(Qt::transparent);
        QPainter painter(&image);
        painter.setRenderHints(QPainter::Antialiasing|QPainter::TextAntialiasing| QPainter::SmoothPixmapTransform);
        svg_remder.render(&painter);
        QPixmap pix;
        pix=pix.fromImage(image);
        pix.setDevicePixelRatio(g_fGlobalDPI);//设置pixmap伸缩比例

        

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值