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