Qt5 - C++ - QImage - NOT scaling right
-
I'm getting confused by the way of drawImage and scaledToHeight (or any kind of scaling) is working. Could any of you help me to understand what's going on here?
So I have the fallowing code:
auto cellX = this->parentWidget()->width() / 100; auto cellY = this->parentWidget()->height() / 100; QImage icon(dir.absoluteFilePath(m_viewModel.icon)); QImage scaled = icon.scaledToHeight(cellY * 40, Qt::SmoothTransformation); painter.drawImage(cellX * 20, cellY * 20, scaled);Now if I understand it correctly this should work as the following:
QImage QImage::scaledToHeight(int height, Qt::TransformationMode mode
= Qt::FastTransformation) constReturns a scaled copy of the image. The returned image is scaled to
the given height using the specified transformation mode.This function automatically calculates the width of the image so that
the ratio of the image is preserved.If the given height is 0 or negative, a null image is returned.
and also
void QPainter::drawImage(int x, int y, const QImage &image, int sx =
0, int sy = 0, int sw = -1, int sh = -1, Qt::ImageConversionFlags
flags = Qt::AutoColor)This is an overloaded function.
Draws an image at (x, y) by copying a part of image into the paint
device.(x, y) specifies the top-left point in the paint device that is to be
drawn onto. (sx, sy) specifies the top-left point in image that is to
be drawn. The default is (0, 0).(sw, sh) specifies the size of the image that is to be drawn. The
default, (0, 0) (and negative) means all the way to the bottom-right
of the image.So in other words,
scaledToHeightis going to return a new image scaled according to that specific height anddrawImageis going to draw that specific image started from point X, Y which I'm going to mention down to the end of the image (because it's -1 and -1 default)QUESTION:
As you could see already my scaled image is strictly depended on the position of drawImage, why is that? How can I scale and draw my image properly? Or in other words WHY if I will position my image at 0 0 or not will affect how my image looks like?
UPDATE:
I have my Widget Class which looks something like this:
class AC_SpeedLevelController : public QWidget { Q_OBJECT protected: void paintEvent(QPaintEvent *event) override; private: AC_ButtonViewModel m_viewModel{}; public: explicit AC_SpeedLevelController(QWidget *parent); void setupStyle(const AC_ButtonViewModel &model) override; };My paintEvent is going to look like:
void AC_SpeedLevelController::paintEvent(QPaintEvent *event) { QWidget::paintEvent(event); QPainter painter(this); QDir dir(qApp->applicationDirPath()); dir.cd("icons"); auto cellX = this->parentWidget()->width() / 100; auto cellY = this->parentWidget()->height() / 100; QImage icon(dir.absoluteFilePath(m_viewModel.icon)); QImage scaled = icon.scaledToHeight(cellY * 20, Qt::SmoothTransformation); painter.drawImage(0, 0, scaled); } -
@Vildnex said in Qt5 - C++ - QImage - NOT scaling right:
auto cellX = this->parentWidget()->width() / 100;
C basics: int = int/int
-
@Vildnex said in Qt5 - C++ - QImage - NOT scaling right:
auto cellX = this->parentWidget()->width() / 100;
C basics: int = int/int
@Christian-Ehrlicher sure... and what has to do this to my issue?
-
Hi,
Example of int division: 240 / 100 = 2
-
@SGaist sure... but why is that important to my question? If you look at the images that I give as an example the second and third image are exactly the same in terms of size, the only difference it's in terms of the initial position. But although the difference is just in terms of position as you can see in one example my image will be cut in half and on the other will be just fine.
-
Since the paint() always starts at 0,0 I would guess the QWidget is moved around somewhere else - the scaling is independent from the upper left position of the start of the drawing.
Putting some debug output about the image size etc. will surely help here.


