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

首先,客户端的适配免不了处理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伸缩比例

        

你可能感兴趣的:(qt,qt)