使用 QGridLayout addWidget(QWidget,x,y) 进行位置操作的问题

Issues with position manipulation using QGridLayout addWidget(QWidget,x,y)

这是一个非常简单的问题,我是 PyQt5 的新手,对 QGridLayout 的工作原理有点困惑...

def init_main_page(self):
        layout = QGridLayout()

        b1 = buttons.QPushButton("0",self.main_page)
        b2 = buttons.QPushButton("1",self.main_page)
        b3 = buttons.QPushButton("2",self.main_page)

        layout.addWidget(b1,0,0)
        layout.addWidget(b2,5,0)
        layout.addWidget(b3,1,0)

        self.main_page.setLayout(layout)

我遇到的问题是,无论我在 addwidget(QWidget,x,y) 中将 x 和 y 参数设置多高,b1 b2 和 b3 始终保持彼此等距。我正在尝试弄清楚如何在保持比例设置的同时操纵按钮的位置(因此避免了 QPushButton.move()),据我所知,QGridLayout 是执行此操作的最佳方法。

通过 "skipping" 行或列设置网格布局中小部件的坐标几乎没有用,因为这些网格坐标仅告诉布局管理器 "slots" 小部件将位于:因为第 2 到 4 行没有任何内容,所以 space 将不会被使用。

要实现您想要的效果,您需要设置 stretch factors 并可能对指定的行使用最小高度。

    layout.addWidget(b1, 0, 0)
    layout.addWidget(b3, 1, 0)
    layout.addWidget(b2, 2, 0)
    layout.setRowStretch(2, 1)
    layout.setRowMinimumHeight(2, 50)

但这可能不是您想要的,因为它将第三个按钮放置在行网格的垂直中心(在底部留空 space)。

为了避免这种情况,有两种可能的解决方案:

  • 通过将对齐方式设置为底部来添加小部件:

    layout.addWidget(b2, 2, 0, alignment=QtCore.Qt.AlignBottom)
    
  • 将最后一个小部件添加到第四行,并为第三个空行设置拉伸和最小高度。

        layout.addWidget(b2, <b>3</b>, 0)
        layout.setRowStretch(<b>2</b>, 1)
        layout.setRowMinimumHeight(<b>2</b>, 50)