2017-07-13 2 views
0

現在、Pixmapを動的にリサイズする問題を解決しようとしていますが、QMainWindowの1つのコーナーにQLabelがあり、 KeepAspectRatioのラベルのサイズで指定します。どちらのスプリッタも信号に接続されており、できるだけピックスマップを調整してできるだけ収まるようにしています。PyQt5 Pixmapのラベルでスプリッタを使用してダイナミックリサイズ

私が遭遇した問題は、ピクスマップがすでに使用可能なすべてのスペースに適合しているときにサイズを減らす方法を理解できないことです。

これはピックスマップの設定です:

self.picture_field.setStyleSheet("border: 4px solid") 
self.pixmap = QPixmap('dandelion.jpg') 
self.picture_field.setAlignment(Qt.AlignCenter) 
self.picture_field.setPixmap(self.pixmap.scaled(self.picture_field.width()-8, 
self.picture_field.height()-8, Qt.KeepAspectRatio)) 

-8それが欠けていた場合は、理由の国境の存在である必要があり、ウィジェットはQsplittersの

つすべての変更に大きくなっ:

right_splitter = QSplitter(Qt.Vertical) 
right_splitter.addWidget(self.picture_field) 
right_splitter.addWidget(self.person_field) 
right_splitter.splitterMoved.connect(self.dynamic_scaling) 

Person_fieldは単純QTreeView

動的サウスカロライナaling機能:

def dynamic_scaling(self): 
    self.picture_field.setPixmap(self.pixmap.scaled(self.picture_field.width()-8, self.picture_field.height()-8, Qt.KeepAspectRatio)) 

編集:私はもう少しそれをテストし、それはそう、ピックスマップが反応することはなく、一度だけの幅または高さのどちらかが半分になります。

w = QtGui.Qlabel.width(); 
h = QtGui.Qlabel.height(); 

#set a scaled pixmap to a w x h window keeping its aspect ratio 
QtGui.Qlabel.setPixmap(p.scaled(w, h, Qt.KeepAspectRatio)) 

は今hwを変更しよう:

+0

あなたのコードをよりよく理解することができます。 – eyllanesc

+2

検証可能なコード(実際に実行して問題のある箇所を確認できるコード)を提供できますか? – Matho

+0

これは非常に面倒なのでコード全体を削除したくないだけですが、ここでは修正して1つのファイルとして機能するようにします:https://pastebin.com/RNDvkmy2 –

答えて

1

、「その瞬間にスプリッタだけで動作を停止するので、私は、ピックスマップはすでに利用可能なすべてのスペースにフィットする際にサイズを小さくすることができるようにする方法を見つけ出すことはできません」、と思う私は、問題が何であるかを知る。すべてのQWidgetには最小サイズがあり、QWidget.minimumSizeという関数で利用できます。経験から私は、QSplitterがその子どもたちの最小サイズを尊重していることを知っています。そして、ユーザーがサッシュを子どもの1人に最小サイズよりも小さくするような位置に動かすことはできません。

スプリッタの子の1つがQLabelであると言います。設計上、QLabelは独自のサイズ要件を考えるのが賢明です。たとえば、QLabelのテキストを変更すると、自動的にサイズ値が再計算され、再レイアウトが開始されます。 Pixmapを変更すると同じことをすると思いますが、私はこれを自分で試していません。ポイントは、QLabelの最小サイズが内容が変化するにつれて変化することです。

QLabelの動的なサイズ変更と、子ウィジェットが最小サイズに違反することを許可するQSplitterの拒否のために、スプリッターが「つぶれている」ように見えて、サイズを小さくすることができなくなることがあります。

これを修正するには、QLabelの最小サイズが、たとえば(1,1)と小さくする必要があります。これを行うにはいくつかの方法があります。私はあなたの完全なアプリケーションを持っていないので、私はあなたのために一番うまくいくかどうかはわかりません。

QLabelをサブクラス化してminimumSizeをオーバーライドする(0,0)これはかなり簡単です。

QLabelオブジェクトのサイズポリシーをQSizePolicy.Ignoreに設定します。関数QWidget.SetSizePolicyのドキュメントを参照してください。

QWidget.SetMimimumSizeを使用してください。私は、あなたが変更しようとする変更が、次にpixmapを変更したときに取り消されるかもしれないので、これがQLabelsでうまくいくかどうかはわかりません。

QLabelを、QWidgetから直接サブクラス化されたカスタムウィジェットに置き換えます。一般的なQWidgetには最小サイズがないため、問題は解決しません。新しいピックスマップをコントロールに設定するための小さな関数を書く必要があります。これはペイントイベントハンドラを必要とします。

私は、これらの方法の1つがあなたのために働くことを望みます(そして私は問題を正しく理解していることを望みます)。

+0

私はもはやチェックすることができないようにプロジェクトの構造が変わったが、私はあなたの答えが正しいと確信しています。 サイズを半分に変更できますが、最小サイズに変更することはできません –

0

がいることをしてみてください。

以下に問題点がある場合は、

この文から判断すると

+0

私はすでにこの方法で使用していますが、私の問題は画像をラベルに直接スケーリングするのではなく、私の問題は、それが既にサイズを持っていれば、私はそれの隣にスプリッターを移動すると、画像を縮小して取得している –

関連する問題