にロードされたTIFF画像のズームに問題があります。QGraphicsPixmapItem
です。画像をスワップするときのQGraphicsViewのビュー/スクロール位置の維持
問題は、アプリケーションのチョークを作らないズームスピードを持つと同時に画質を維持することです。まず最初に、画像を置き換えたのは、QPixmap
です。ユーザーが水平スライダーを押している間にQt.FastTransformation
を使用し、スライダーを離したときに、Qt.SmoothTransformation
を使用してもう一度pixmapを置き換えました。これは素晴らしい質のズームされた画像を与えましたが、画像サイズが元のサイズよりも大きくなるようになった後にズーキーがかかりました。画像のズームアウトは問題ありませんでした。
QGraphicsViewでQTransform.fromScale()を使用すると、QGraphicsViewに.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform | QPainter.HighQualityAntialiasing)
を適用しても、はるかにスムーズなズームが可能ですが、低品質の画像が得られます。
最新の方法は、QTransform
をQGraphicsView
に使用してスムーズにズームすることですが、ユーザーがスライダーを放してQGraphicsView
の画像を拡大縮小したピックスマップで置き換えることです。これは素晴らしいですが、ビュー内の位置は失われます。ユーザーは1つの領域にズームインし、拡大されたピクスマップが大きいので、スライダが解放され、以前の画像に高品質の拡大縮小されたピックスマップが置き換えられます。
どちらの画像でも幅の高さの比率が同じであるため、画像スワップの前にスクロールバーの割合をとり、スワップ後に同じ割合を適用するとうまくいくはずです。これは主にうまくいきますが、画像を交換した後にビューが「ジャンプ」するときがあります。
私はここでかなり間違っていると確信しています。誰かがこれを行うためのより良い方法を知っていますか、誰かがこのジャンプを引き起こす可能性のある以下のコードで何かを見つけることができますか?
これは、スクロールバーの場所を保存/復元するためのコードです。彼らは、サブクラス化QGraphicsView
のメソッドです:
def store_scrollbar_position(self):
x_max = self.horizontalScrollBar().maximum()
if x_max:
x = self.horizontalScrollBar().sliderPosition()
self.scroll_x_percentage = x * (100/float(x_max))
y_max = self.verticalScrollBar().maximum()
if y_max:
y = self.verticalScrollBar().sliderPosition()
self.scroll_y_percentage = y * (100/float(y_max))
def restore_scrollbar_position(self):
x_max = self.horizontalScrollBar().maximum()
if self.scroll_x_percentage and x_max:
x = x_max * (float(self.scroll_x_percentage)/100)
self.horizontalScrollBar().setSliderPosition(x)
y_max = self.verticalScrollBar().maximum()
if self.scroll_y_percentage and y_max:
y = y_max * (float(self.scroll_y_percentage)/100)
self.verticalScrollBar().setSliderPosition(y)
そして、ここでは、私はスケーリングをやっている方法です。 self.imageFile
はQPixmap
、self.image
は私のQGraphicsPixmapItem
です。再び、サブクラスの一部はQGraphicsView
です。このメソッドは、highQuality
パラメータがFalse
に設定された状態でスライダの動きに関連付けられます。画像を交換するために、highQuality
としてTrue
とスライダリリースで再度呼び出されます。
def setImageScale(self, scale=None, highQuality=True):
if self.imageFile.isNull():
return
if scale is None:
scale = self.scale
self.scale = scale
self.image.setPixmap(self.imageFile)
self.scene.setSceneRect(self.image.boundingRect())
self.image.setPos(0, 0)
if not highQuality:
self.setTransform(QTransform.fromScale(self.scaleFactor, self.scaleFactor))
self.store_scrollbar_position()
else:
self.image.setPixmap(self.imageFile.scaled(self.scaleFactor * self.imageFile.size(),
Qt.KeepAspectRatio, Qt.SmoothTransformation))
self.setTransform(self.transform)
self.scene.setSceneRect(self.image.boundingRect())
self.image.setPos(0, 0)
self.restore_scrollbar_position()
return
助けていただければ幸いです。私は今これでかなり不満を持ち始めている。