2016-05-20 11 views
0

スタイルシート付きのウィジェットをたくさん含むアプリケーションがありましたが、インターフェイスにレイアウトを追加しませんでした。中央ウィジェットは含まれていませんでしたが、アプリケーションは問題なく実行されていました。PyQt:スケールされたモードでスタイルシートのコンテンツを設定するにはどうすればよいですか?

しかし、私がアプリケーションのサイズを変更しようとすると(スケールダウンしたとき)、ウィジェットはスケールされませんでした。

(私は私の問題に関連して何かを見つけることができなかったので)私は少し研究していたと私はQtのドキュメントでこれを見つけ、スタイルシートの参照:

描かれている「実際の画像が決定されますQIconと同じアルゴリズムを使用しています(つまり、画像は拡大されることはありませんが、必要に応じて常に縮小されます)。

私はどのようにスタイルシートをウィンドウで縮小できますか?例えば


(スタイルシートは上の背景画像を持っている場合)私は、スタイルシートの付いたボタンがあります。

btn = QtGui.QPushButton(self) 
btn.move(0, 0) 
btn.setObjectName('btn) 
btn.setStyleSheet("#btn {background-image: url(':/images/somepicture.png'); border: none; }") 

は、どのように私はレイアウトせずにこれを達成することができ、このボタンは、ウィンドウを縮小することができますか?どうすればレイアウトでそれをすることができますか? (あまりにも制限がない)

+0

現在の表示方法のスクリーンショットを含めることはできますか? 「それには中央のウィジェットは含まれていない」というのは意味をなさない。あるいは 'QMainWindow'を全く持っていませんでしたか? – mfitzp

+0

それはうまく動く、私はそれも実行可能に凍結され、働いた、私は自分自身を中央のウィジェットを割り当てていないはい、それはQMainWindowを持って、私はまた私はレイアウトを追加しようとしたときに、それは警告を与えた:QLayoutを追加しようと " "to Window" "、これは既にレイアウトを持っています。 @mfitzp – ShellRox

答えて

1

ボタンを中央のウィジェットとしてQMainWindowに追加すると、そのサイズは使用可能なスペースに合わせて自動的に調整されます。しかし、ボタン画像を拡大縮小するには、画像をborder-imageスタイルシートプロパティ(ちょっと変わったもの)として設定する必要があります。 PyQt4のための作業例:あなたは、単に.setStyleSheet()を経由してCSSルールに渡すことができ、特定のウィジェットにCSSを割り当てるには、ID(objectName)を設定する必要はありません

from PyQt4 import QtGui, QtCore 

class MainWindow(QtGui.QMainWindow): 

    def __init__(self, *args, **kwargs): 
     super(MainWindow, self).__init__(*args, **kwargs) 

     btn = QtGui.QPushButton(self) 
     btn.setStyleSheet("border-image: url('somepicture.png');") # Scaled 
     #btn.setStyleSheet("background-image: url('somepicture.png');") # Not scaled 

     self.setCentralWidget(btn) 

     self.show() 

app = QtGui.QApplication([]) 
window = MainWindow() 

app.exec_() 

注意。

QMainWindowにレイアウトを設定することは、ドッキングウィジェットとツールバーに対応するための複雑なレイアウトシステムを既に持っているためです。したがって、レイアウトを使用して複数のウィジェットをウィンドウに追加する場合は、ウィジェットを保持するためにコンテナウィジェットを使用する必要があります。へ

from PyQt4 import QtGui, QtCore 

class MainWindow(QtGui.QMainWindow): 

    def __init__(self, *args, **kwargs): 
     super(MainWindow, self).__init__(*args, **kwargs) 

     w = QtGui.QWidget() # container widget 
     l = QtGui.QVBoxLayout() # your layout 
     w.setLayout(l) # set the layout on your container widget 

     btn = QtGui.QPushButton(self) 
     btn.setStyleSheet("border-image: url('somepicture.png');")  

     label = QtGui.QLabel('Hello!') 

     l.addWidget(btn) # add your widget to the layout 
     l.addWidget(label) # add the label to the layout 

     self.setCentralWidget(w) # add the container widget to the QMainWindow   

     self.show() 

app = QtGui.QApplication([]) 
window = MainWindow() 

app.exec_() 

あなたは(そのサイズ/位置を制御します)ではなく、レイアウトに追加するよりも、絶対にウィジェットを配置できるようにしたい場合は、親要素を渡すことができます(相対:次の作業の例では、これが実証しますここで、X、それを作成するときに、Y COORDS)が取られています。

from PyQt4 import QtGui, QtCore 

class MainWindow(QtGui.QMainWindow): 

    def __init__(self, *args, **kwargs): 
     super(MainWindow, self).__init__(*args, **kwargs) 

     w = QtGui.QWidget() # container widget 

     btn = QtGui.QPushButton(w) 
     btn.move(100,100) 
     btn.setStyleSheet("border-image: url('somepicture.png');")  

     self.setCentralWidget(w) # add the container widget to the QMainWindow   
     self.show() 

app = QtGui.QApplication([]) 
window = MainWindow() 

app.exec_() 

しかし、絶対に次のようにウィジェットを配置することはあなたにそれが親ウィジェットに合わせて、自動スケールする能力を失います。ウィンドウ内の要素の周りにいくつかのパディング/スペーシングが必要な場合はQLayouts.setContentsMarginsを見てください。 l.setContentsMargins(50,50,50,50)はボタンの周りに50ピクセルの余白を入れます。

+0

大変ありがとう@mfitzp両方とも非常にうまくいってくれました。また、私は答えを感謝しています。レイアウトはありますか?例えば、btn.move(200,200) 'を実行するたびに、私はGridLayoutのことを聞いたことがあるのですが、スケールされたモードで動作するのですか?それらに行を追加する必要はありますか? | | QLayout:MainWindowに "QLayoutを追加しようとしました" "、既にレイアウトがあります。 – ShellRox

+1

@ShellRox 2番目のコードを完全な実例に更新しました。絶対配置のためには、レイアウトのないウィジェットを作成する必要がありますが、親ウィジェットは親として作成する必要があります。 'QtGui.QPushButton(w)'は、追加コードを参照してください。 – mfitzp

+0

もう一度、私はこれらの最終的な質問を持っています:どのように私は、GridLayoutですべてのウィジェットを移動することができますので、私はウィンドウに複数のウィジェットを置くことができるので、私は2つのボタンがあります権利。また、ボタンの最大スケーリングを元のサイズに設定するにはどうしたらいいですか?したがって、それは縮小することしかできません。 – ShellRox

関連する問題