我需要在不指定行和列索引的情况下创建QWidget
( QtoolButton
) 。QgridLayout
它应该根据提到的行和列自动创建到布局中的下一个空单元格。
QgridLayout
我在帮助中找不到任何方法。
我试过.addWidget (self, QWidget w)
了,但它把所有的都添加QWidget
到(0,0)的索引中,所有的按钮都相互重叠。
提前致谢。
我需要在不指定行和列索引的情况下创建QWidget
( QtoolButton
) 。QgridLayout
它应该根据提到的行和列自动创建到布局中的下一个空单元格。
QgridLayout
我在帮助中找不到任何方法。
我试过.addWidget (self, QWidget w)
了,但它把所有的都添加QWidget
到(0,0)的索引中,所有的按钮都相互重叠。
提前致谢。
假设您有QGridLayout
4 行 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_())
您可以通过自己计算行和列来处理“下一个空单元格”。例如,您可以根据需要子类 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,那么您应该使用嵌套在一个 QVBoxLayout 中的多个 QHBoxLayouts(每行一个)。这也将为您提供您想要的行为,按需创建新项目,没有令人讨厌的差距。