1

行と列のインデックスを指定せずにQWidget( QtoolButton)を作成する必要があります。QgridLayout言及された行と列に従って、レイアウト内の次の空のセルに自動的に作成されるはずです。

ヘルプで方法を見つけることができませんでしたQgridLayout

を試し.addWidget (self, QWidget w)ましたが、すべてを (0,0) のインデックスに追加し、QWidgetすべてのボタンが重なり合っています。

前もって感謝します。

4

3 に答える 3

2

4行3列のQGridLayoutがあり、上から下、左から右にボタンを自動的に追加するとします。次に追加するボタンの位置を予測できれば、これは簡単に実現できます。私たちの場合には:

  • 行=追加されたボタンの数/列の数
  • column =追加されたボタンの数%列の数

(他のタイプの充填も同様に機能します)。それをコードに入れましょう:

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_())
于 2012-10-26T09:17:50.147 に答える
1

行と列を自分で計算することで、「次の空のセル」を処理できます。たとえば、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の次の列が使用されます)。

于 2012-10-26T06:12:25.150 に答える
1

他の回答への追加:実際のgridではなく、可変数の項目を持つ行だけが必要な場合は、1 つの QVBoxLayout にネストされた複数の QHBoxLayouts (行ごとに 1 つ) を使用する必要があります。これにより、必要な動作、オンデマンドで作成された新しいアイテム、厄介なギャップも発生しなくなります。

于 2012-10-26T10:14:13.097 に答える