【问题标题】:Issues with position manipulation using QGridLayout addWidget(QWidget,x,y)使用 QGridLayout addWidget(QWidget,x,y) 进行位置操作的问题
【发布时间】:2020-06-17 07:00:43
【问题描述】:

这是一个非常简单的问题,我刚接触 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 是最好的方法。

【问题讨论】:

    标签: python pyqt pyqt5 qgridlayout


    【解决方案1】:

    通过“跳过”行或列来设置网格布局中小部件的坐标几乎没有用,因为这些网格坐标只会告诉布局管理器小部件将位于哪个“插槽”中:因为在第 2 到 4 行,该空间将不会被使用。

    要达到您想要的效果,您需要设置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)
    

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

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

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

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

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

    【讨论】:

    • 我不知道非常感谢你,我能够让它工作!我应该知道最后一个可能的解决方案中的第三行等空行有什么问题吗?
    • “跳过”行或列并没有错,但有时您可能更喜欢使用分隔符(这是在 Designer 中构建 UI 时最常用的方法):您可以使用 QSpacerItem或具有适当的最小和/或最大尺寸以及正确尺寸策略的基本 QWidget。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多