1

我需要在不指定行和列索引的情况下创建QWidget( QtoolButton) 。QgridLayout它应该根据提到的行和列自动创建到布局中的下一个空单元格。

QgridLayout我在帮助中找不到任何方法。

我试过.addWidget (self, QWidget w)了,但它把所有的都添加QWidget到(0,0)的索引中,所有的按钮都相互重叠。

提前致谢。

4

3 回答 3

2

假设您有QGridLayout4 行 3 列的 a,并且您想从上到下和从左到右自动向其添加按钮。如果您能够预测要添加的下一个按钮的位置,这很容易实现。在我们的例子中:

  • 行 = 添加的按钮数 / 列数
  • 列 = 添加的按钮数 % 列数

(其他类型的填充工作类似)。让我们把它放在代码中:

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,那么您应该使用嵌套在一个 QVBoxLayout 中的多个 QHBoxLayouts(每行一个)。这也将为您提供您想要的行为,按需创建新项目,没有令人讨厌的差距。

于 2012-10-26T10:14:13.097 回答