旋转QGraphicsPixmapItem导致剪切如果调整大小不保持纵横比(Rotate QGrap

2019-10-24 14:07发布

我想旋转QGraphicsPixmapItem孩子。 对于其他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秒,该项目必须记住的旋转。

Answer 1:

它仍然是一个谜,为什么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);

如果有一个更好的解决方案,我会很乐意看到它。



文章来源: Rotate QGraphicsPixmapItem results in shear if resizing without keeping aspect ratio