如果在不保持纵横比的情况下调整大小,则旋转 QGraphicsPixmapItem 会导致剪切
Rotate QGraphicsPixmapItem results in shear if resizing without keeping aspect ratio
我正在尝试旋转 QGraphicsPixmapItem
child。对于其他 QGraphicsItem
,旋转和缩放工作正常。但是对于 QGraphicsPixmapItem
,如果尺寸不保持纵横比,我会得到剪切而不是旋转。
示例代码:
#include <QApplication>
#include <QGraphicsView>
#include <QMessageBox>
#include <QGraphicsPixmapItem>
#include <QFileDialog>
int main(int argc, char *argv[])
{
QGraphicsScene s;
s.setSceneRect(-200, -200, 500, 500);
QGraphicsView view(&s);
view.show();
QGraphicsPixmapItem p;
QString fileName = QFileDialog::getOpenFileName(0, QObject::tr("Open Image File"), QString(), QObject::tr("Png files (*.png);;Jpeg files (*.jpg *.jpeg);;Bitmap files (*.bmp)"));
p.setPixmap(QPixmap(fileName));
s.addItem(&p);
QMessageBox::information(0, "", "");
QTransform original = p.transform();
// scale aspect ratio then rotate
QTransform scalingTransform0(0.5, 0, 0, 0, 0.5, 0, 0, 0, 1);
// p.setTransformOriginPoint(p.boundingRect().center()); // doesn't help shear
p.setTransform(scalingTransform0 * original);
p.setRotation(20);
QMessageBox::information(0, "", "");
// scale
QTransform scalingTransform(0.5, 0, 0, 0, 1, 0, 0, 0, 1);
p.setTransform(scalingTransform * original);
QMessageBox::information(0, "", "");
// rotate
p.setRotation(20);
QMessageBox::information(0, "", "");
// unrotate then rotate again
p.setRotation(0);
QMessageBox::information(0, "", "");
QTransform rotTransform = p.transform().rotate(20);
p.setTransform(rotTransform);
// or p.rotate(20);
return app.exec();
}
结果:
我不知道如何在 QGraphicsPixmapItem
秒内进行不剪切的简单旋转,并且项目必须记住旋转。
为什么 QGraphicsPixmapItem
表现如此不一致仍然是个谜。
解决方案:
缩放项目时,缩放像素图,将生成的像素图应用于项目。
在这种情况下,旋转将起作用(因为 QGraphicsPixmapItem
并未真正缩放)。
QPixmap p1 = pixmap.scaled(100, 100, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
p.setPixmap(p1);
p.setRotation(20);
这种方法会降低质量,所以我最终重新加载了文件
QPixmap p1 = (QPixmap(fileName)).scaled(100, 100, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
p.setPixmap(p1);
p.setRotation(20);
如果有更好的解决办法,我会很乐意看到的
我正在尝试旋转 QGraphicsPixmapItem
child。对于其他 QGraphicsItem
,旋转和缩放工作正常。但是对于 QGraphicsPixmapItem
,如果尺寸不保持纵横比,我会得到剪切而不是旋转。
示例代码:
#include <QApplication>
#include <QGraphicsView>
#include <QMessageBox>
#include <QGraphicsPixmapItem>
#include <QFileDialog>
int main(int argc, char *argv[])
{
QGraphicsScene s;
s.setSceneRect(-200, -200, 500, 500);
QGraphicsView view(&s);
view.show();
QGraphicsPixmapItem p;
QString fileName = QFileDialog::getOpenFileName(0, QObject::tr("Open Image File"), QString(), QObject::tr("Png files (*.png);;Jpeg files (*.jpg *.jpeg);;Bitmap files (*.bmp)"));
p.setPixmap(QPixmap(fileName));
s.addItem(&p);
QMessageBox::information(0, "", "");
QTransform original = p.transform();
// scale aspect ratio then rotate
QTransform scalingTransform0(0.5, 0, 0, 0, 0.5, 0, 0, 0, 1);
// p.setTransformOriginPoint(p.boundingRect().center()); // doesn't help shear
p.setTransform(scalingTransform0 * original);
p.setRotation(20);
QMessageBox::information(0, "", "");
// scale
QTransform scalingTransform(0.5, 0, 0, 0, 1, 0, 0, 0, 1);
p.setTransform(scalingTransform * original);
QMessageBox::information(0, "", "");
// rotate
p.setRotation(20);
QMessageBox::information(0, "", "");
// unrotate then rotate again
p.setRotation(0);
QMessageBox::information(0, "", "");
QTransform rotTransform = p.transform().rotate(20);
p.setTransform(rotTransform);
// or p.rotate(20);
return app.exec();
}
结果:
我不知道如何在 QGraphicsPixmapItem
秒内进行不剪切的简单旋转,并且项目必须记住旋转。
为什么 QGraphicsPixmapItem
表现如此不一致仍然是个谜。
解决方案:
缩放项目时,缩放像素图,将生成的像素图应用于项目。
在这种情况下,旋转将起作用(因为 QGraphicsPixmapItem
并未真正缩放)。
QPixmap p1 = pixmap.scaled(100, 100, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
p.setPixmap(p1);
p.setRotation(20);
这种方法会降低质量,所以我最终重新加载了文件
QPixmap p1 = (QPixmap(fileName)).scaled(100, 100, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
p.setPixmap(p1);
p.setRotation(20);
如果有更好的解决办法,我会很乐意看到的