2017-12-15 5 views
1

QLineEditボックスの列スパンをレイアウトに追加した後に設定することはできますか?私はQGridLayoutに2つのQLineEditボックスを持っています。これらのボックスは、互いに横に並んでいます。私のコードの実行中に、これらのボックスの1つが隠されます。私は、隠れたものが端に奇妙な隙間を避けるためにあった列のスパンを増やし、必要に応じて減らしたいと思います。QGridLayoutのウィジェットの列スパンをリセットするにはどうすればいいですか?

レイアウトにウィジェットを追加する前に、このタイプの変更について実際にQtドキュメントで何も見つけられませんでした。

答えて

1
あり

ウィジェットが追加された後行優先または列スパンをリセットする方法はありません。ただし、同じレイアウトにウィジェットを再追加すると、最初に暗黙的に削除されるため、同じ影響を得るために同じウィジェットでaddWidgetを再度呼び出すことができます。したがって、このような作業をする必要があります:私は、これがそうであったと仮定

import sys 
from PyQt5 import QtCore, QtWidgets 

class Window(QtWidgets.QWidget): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.button = QtWidgets.QPushButton('Toggle Edit') 
     self.button.clicked.connect(self.handleButton) 
     self.edit1 = QtWidgets.QLineEdit() 
     self.edit1.setPlaceholderText('One') 
     self.edit2 = QtWidgets.QLineEdit() 
     self.edit2.setPlaceholderText('Two') 
     layout = QtWidgets.QGridLayout(self) 
     layout.addWidget(self.edit1, 0, 0) 
     layout.addWidget(self.edit2, 0, 1) 
     layout.addWidget(self.button, 1, 0) 

    def handleButton(self): 
     if self.edit2.isHidden(): 
      self.setWidgetSpan(self.edit1, 1, 1) 
      self.edit2.setHidden(False) 
     else: 
      self.edit2.setHidden(True) 
      self.setWidgetSpan(self.edit1, 1, 2) 

    def setWidgetSpan(self, widget, rowspan=1, colspan=1): 
     layout = self.layout() 
     index = layout.indexOf(widget) 
     row, column = layout.getItemPosition(index)[:2] 
     layout.addWidget(widget, row, column, rowspan, colspan) 

if __name__ == '__main__': 

    app = QtWidgets.QApplication(sys.argv) 
    window = Window() 
    window.setGeometry(600, 100, 300, 100) 
    window.show() 
    sys.exit(app.exec_()) 
+0

が、私は、再追加す​​ることが所望の効果を生み出すことを知らなかった。ここで

index = layout.indexOf(widget) row, column = layout.getItemPosition(index)[:2] layout.addWidget(widget, row, column, rowspan, colspan) 

は簡単なデモスクリプトです。私の場合は、いくつかの明白な変更を加えてUIファイルを使用しますが、同じ効果が得られますか? –

+1

@AaronTomason。ウィジェットとそのウィジェットへの参照が必要です。 – ekhumoro

0

次のようにしてください。

QLineEditを2つ追加すると、QGridLayoutは動的に2つの列を作成します。

スパニング用に余分な列を使用する場合は、QSpacerItemを使用して列を追加します。 addItem(..,..,..)QGridLayoutを使用してレイアウトにスペーサーアイテムを追加する必要があります。あなたが(例えば)totak 4スペーサーを追加する場合は、あなたの2つのQLineEdit追加スペーサ間

spacer1 = QtGui.QSpacerItem(20, 20) 
layout.addItem(spacer1,0,2) 

spacer2 = QtGui.QSpacerItem(20, 20) 
layout.addItem(spacer2,0,3) 

spacer3 = QtGui.QSpacerItem(20, 20) 
layout.addItem(spacer3,0,4) 
は今、あなたは合計6列を持って、今

spacer = QtGui.QSpacerItem(20, 20) 
layout.addItem(spacer,0,1) 

以下のように----- - 最初にQLineEdit(列0)、4つのスペーサー、最後にQLineEdit(列5)

ここでsetColumnStretch(column,stretch)を使用して、ライン編集。ここでは、最後にQLineEditのスパンを設定しようとしています。以下に示すとおりです。 ... 3列に対してスパンこのことができます

layout.setColumnStretch(5,3) 

希望...

関連する問題