将军小说Qt-⾼分辨率drawImage模糊问题
问题:
在设置了以下代码后,图⽚在⾼分辨率下显⽰的挺好
QGuiApplication::tAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication::tAttribute(Qt::AA_UHighDpiPixmaps);
软件打不开但是在paintEvent⾥绘制图⽚,不管是drawImage还是drawPixmap效果都不是很好
医生个人简介解决⽅案:
⽐如在1080p上你要显⽰32x32的图⽚,那么在2K上准备⼀个64x64的图⽚
QPainter painter(this);
painter.tRenderHint(QPainter::HighQualityAntialiasing);
QPixmap pixmap = icon().pixmap(iconSize());
豇豆茄子
引人注目拼音qreal pixelRatio = painter.device()->devicePixelRatioF();
pixmap = pixmap.scaled(QSize(iconSize().width() * pixelRatio, iconSize().height() * pixelRatio), Qt::IgnoreAspectRatio, Qt::SmoothTransformation); QPainter icon(&pixmap);
icon.tCompositionMode(QPainter::CompositionMode_SourceIn);
icon.(), isEnabled() ? color() : disabledColor());
const qreal w = iconSize().width();
const qreal h = iconSize().height();
painter.drawPixmap(QRect((rect().width() - w) / 2, (rect().height() - h) / 2, w, h), pixmap);
我们加载的pixmap原⼤⼩是64x64的, 在1080p上⼀下代码可以很好的转换成32x32的
pixmap = pixmap.scaled(QSize(32, 32), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
但是在2K屏幕上,⼀样的代码会模糊。
所以先获取当前设备的pixelRatio
现货公司//下⾯两⾏代码是解决问题的关键
qreal pixelRatio = painter.device()->devicePixelRatioF();
转换时,⽤你要装换的⼤⼩乘以这个系数,如下
pixmap = pixmap.scaled(QSize(iconSize().width() * pixelRatio, iconSize().height() *
pixelRatio), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
这时pixmap的⼤⼩不⼀定是32x32了,但是我们drawPixmap的时候⼀定把他当做32x32的rect就好了,注意,这⾥不要填();⽽是你想要转换的没乘以系数的那个rect,⽐如();
painter.drawPixmap(0, 0, w, h), pixmap);
到此问题解决
延伸,在没设置凯⽂那两⾏代码前,可以使⽤下⾯的代码获取⽂本缩放⽐率
float MiFramelessWindow::getTextScaled()行政职级
{
double rate = 0;
QList<QScreen *> screens = QApplication::screens();
if (screens.size() > 0) {
double dpi = this->screen()->logicalDotsPerInch();
rate = dpi / 96.0;
if (rate < 1.1) {
rate = 1.0;
}
el if (rate < 1.4) {
rate = 1.25;
}
el if (rate < 1.6) {
rate = 1.5;
}
el if (rate < 1.8) {
rate = 1.75;
}
谢老师
el {
rate = 2.0;
}
}
return rate;
}