QGraphicsScene に QGraphicsPixmapItem があり、QGraphicsView でズームインして回転します。回転がない場合、またはズームインしすぎていない場合はすべてうまく機能しますが、ズームインすると (ピクセルが非常に目立ちます)、回転すると奇妙なことが起こります。画像が期待どおりに見える場合もあれば、ピックスマップが (部分的または完全に) 消えたり、画像に水平方向のグラデーションが表示される場合もあります (画像が回転しても水平のままです)。
最初の画像は、別のグリッド (線の集まり) が上に配置されたチャート (色のグラデーションがあってはなりません) です。2 番目の画像は、私の最小限の例 (以下) からのもので、ピックスマップが部分的に欠落していることを示しています (ショットはピックスマップの端から遠く離れています)。
以下は、私が見ているもののほとんどを示す簡単な例です。
#ifndef VIEW_H
#define VIEW_H
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsPixmapItem>
#include <QWheelEvent>
#include <QKeyEvent>
class View : public QGraphicsView
{
Q_OBJECT
public:
explicit View(QWidget *parent = 0) :
QGraphicsView(parent)
{
setDragMode(QGraphicsView::ScrollHandDrag);
QGraphicsPixmapItem *pixmapItem = new QGraphicsPixmapItem(QPixmap(":/images/chart.png"));
pixmapItem->setTransformationMode(Qt::SmoothTransformation);
QGraphicsScene *scene = new QGraphicsScene();
scene->addItem(pixmapItem);
setScene(scene);
}
protected Q_SLOTS:
void wheelEvent(QWheelEvent *event)
{
if(event->delta() > 0)
scale(1.25, 1.25);
else
scale(0.8, 0.8);
}
void keyPressEvent(QKeyEvent *event)
{
if(event->key() == Qt::Key_Left)
rotate(1);
else if(event->key() == Qt::Key_Right)
rotate(-1);
}
};
#endif // VIEW_H
これを囲む他のファイルは、画像を含むリソース ファイル、UI に View を保持する QMainWindow クラス、およびメイン ウィンドウ クラスを実行する main です。これらはすべてGithub プロジェクトで利用できます。
マウスのスクロールホイールでズームイン、矢印キーで回転を再現(マウスでパンも可能)。十分にズームインして回転すると、ピックスマップは一部の角度で (部分的または完全に) 消えます。この例の勾配を再現することはまだできていませんが、これらは同じ問題の別の兆候にすぎないのではないかと考えています。
変換を SmoothTransformation に設定し、renderHint を Antialiasing と HighQualityAntialiasing の両方に設定しようとしましたが、どちらも大きな効果はありませんでした (アンチエイリアシングは高ズームでジャギーを滑らかにします)。さらに、QGraphicView、QGraphicsScene 関連の描画で多くのフラグを切り替えようとしました。これがなぜ起こっているのか、または私がそれに対処しようとすることができる理由を誰かが知っていますか?
Qt 4.8.2 と 10/18/16 に Qt の現在の安定版としてダウンロードした Qt 5.5.1 の両方でこの問題を確認しました。