行と列のインデックスを指定せずにQWidget
( QtoolButton
)を作成する必要があります。QgridLayout
言及された行と列に従って、レイアウト内の次の空のセルに自動的に作成されるはずです。
ヘルプで方法を見つけることができませんでしたQgridLayout
。
を試し.addWidget (self, QWidget w)
ましたが、すべてを (0,0) のインデックスに追加し、QWidget
すべてのボタンが重なり合っています。
前もって感謝します。
行と列のインデックスを指定せずにQWidget
( QtoolButton
)を作成する必要があります。QgridLayout
言及された行と列に従って、レイアウト内の次の空のセルに自動的に作成されるはずです。
ヘルプで方法を見つけることができませんでしたQgridLayout
。
を試し.addWidget (self, QWidget w)
ましたが、すべてを (0,0) のインデックスに追加し、QWidget
すべてのボタンが重なり合っています。
前もって感謝します。
4行3列のQGridLayout
があり、上から下、左から右にボタンを自動的に追加するとします。次に追加するボタンの位置を予測できれば、これは簡単に実現できます。私たちの場合には:
(他のタイプの充填も同様に機能します)。それをコードに入れましょう:
from PyQt4.QtGui import *
class MyMainWindow(QMainWindow):
def __init__(self, parent=None):
super(MyMainWindow, self).__init__(parent)
self.central = QWidget(self)
self.grid = QGridLayout(self.central)
self.rows = 4
self.cols = 3
self.items = self.grid.count()
while(self.items < (self.rows * self.cols)):
self.addButton()
self.setCentralWidget(self.central)
def addButton(self):
# the next free position depends on the number of added items
row = self.items/self.cols
col = self.items % self.cols
# add the button to the next free position
button = QPushButton("%s, %s" % (row, col))
self.grid.addWidget(button, row, col)
# update the number of items
self.items = self.grid.count()
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
ui = MyMainWindow()
ui.show()
sys.exit(app.exec_())
行と列を自分で計算することで、「次の空のセル」を処理できます。たとえば、QGridLayoutをサブクラス化して、必要に応じて「次の空のセル」アルゴリズムを実装できます。
class AutoGridLayout(QGridLayout):
def __init__(self):
QGridLayout.__init__(self)
self.column = 0
self.row = 0
def addNextWidget(self, widget):
self.addWidget(widget, self.row, self.column)
self.column = self.column + 1 # Automatically advance to next column
# Setup main widget
app = QApplication(sys.argv)
mainWindow = QMainWindow()
centralWidget = QWidget()
mainWindow.setCentralWidget(centralWidget)
# Add widgets using the AutoGridLayout
layout = AutoGridLayout()
centralWidget.setLayout(layout)
layout.addNextWidget(QPushButton("1", centralWidget))
layout.addNextWidget(QPushButton("2", centralWidget))
layout.addNextWidget(QPushButton("3", centralWidget))
# Show and run the application
mainWindow.show()
app.exec_()
このソースは、一般的な考え方のみを示しています。必要に応じて、行と列のインデックスを管理できます。次の目的の行/列を計算して、addNextWidget()メソッドに必要なロジックを実装するだけです(この例では、行0の次の列が使用されます)。
他の回答への追加:実際のgridではなく、可変数の項目を持つ行だけが必要な場合は、1 つの QVBoxLayout にネストされた複数の QHBoxLayouts (行ごとに 1 つ) を使用する必要があります。これにより、必要な動作、オンデマンドで作成された新しいアイテム、厄介なギャップも発生しなくなります。