[英]Qt - QPainter not painting QPixmap w/ Aspect Ratio
I am painting in a custom widget to match the "Google-Styled" cards. 我正在自定义窗口小部件中绘画以匹配“ Google样式”卡片。 I have most of the dimensions and font correct however upon painting an image it is always stretched.
我的大多数尺寸和字体都正确,但是在绘制图像时始终会拉伸。 Here is a reference image and the relevant code.
这是参考图像和相关代码。 I would like to keep the image at it's default aspect ratio.
我想将图像保持在默认的宽高比。
Image: 图片:
QRect topPortion = QRect(QPoint(0, 0), QSize(width(), (height()/4)*3));
QPainterPath backgroundPath;
backgroundPath.addRect(topPortion);
QPainterPath bottom = getCornerPath().subtracted(backgroundPath);
QRect bottomRect = QRegion(rect()).subtracted(QRegion(topPortion)).boundingRect();
painter.fillPath(getCornerPath(), m_bColor);
painter.fillPath(bottom, m_fColor);
painter.drawPixmap(topPortion, m_image.scaled(topPortion.size(), Qt::KeepAspectRatio, Qt::FastTransformation));//Issue
painter.setPen(QPen(QColor(50, 50, 50)));
painter.setFont(titleFont);
painter.drawText(QPointF(12, topPortion.height()+((bottomRect.height()-fontHeight)/2)+QFontMetrics(titleFont).ascent()), "Add Record");
painter.setFont(subtitleText);
painter.drawText(QPointF(12, topPortion.height()+((bottomRect.height()-fontHeight)/2)+fontHeight), "Add Record");
You're scaling your image with m_image.scaled
function, however passing also to painter.drawPixmap
function, the topPortion
variable, and according to docs : 您正在使用
m_image.scaled
函数缩放图像,但是还会传递给painter.drawPixmap
函数, topPortion
变量并根据docs进行topPortion
:
The pixmap is scaled to fit the rectangle, if both the pixmap and rectangle size disagree.
如果像素图和矩形大小都不相同,则将像素图缩放为适合矩形。
So my solution is: 所以我的解决方案是:
//Your's calculation area
QRect topPortion = QRect(QPoint(0, 0), QSize(width(), (height() / 4) * 3));
QPixmap pixmap = QPixmap(1024, 768); //Random image
pixmap.fill(Qt::red); //Random color
//Scaled size that will be used to set draw aera to QPainter, with aspect ratio preserved
QSize size = pixmap.size().scaled(topPortion.size(), Qt::KeepAspectRatio);
//Draw the pixmap inside the scaled area, with aspect ratio preserved
painter.drawPixmap(topPortion.x(), topPortion.y(), size.width(), size.height(), pixmap);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.