PyQt5 - 按钮和标签应具有相同的高度

Posted

技术标签:

【中文标题】PyQt5 - 按钮和标签应具有相同的高度【英文标题】:PyQt5 - Buttons and Label shall have the same height 【发布时间】:2021-12-16 18:21:24 【问题描述】:

这是一个简单的应用程序。只有一个标签和三个按钮。但是布局给我带来了麻烦。

我想让标签的子布局和按钮的子布局具有相同的高度。但我无法让它工作。 BoxLayouts 和 GridLayouts 都不是。我尝试添加拉伸,所以两种布局都有相同的拉伸因子和各种不同的东西。我确信答案很简单,但我无法弄清楚。 我也在 QtDesigner 中尝试过,所以我可以检查和比较代码部分,但是:

这是我设计的

在运行代码时得到了这个,按钮再次粘在底部并且与标签的高度不同

但是,这是我的代码:

(我知道这里不需要网格布局,它只是试图解决问题。无论如何我不认为网格布局是问题,因为我在 BoxLayouts 或只是没有布局的标签。)

import sys
from PyQt5 import QtCore
from PyQt5.QtWidgets import QWidget, QApplication, QHBoxLayout, QLabel, QVBoxLayout, QPushButton, QGroupBox, \
    QGridLayout, QMainWindow, QSizePolicy


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(100, 50, 400, 300)
        self.setWindowTitle("Fretboard Note Quiz")

        self.layout()

        self.show()

    def layout(self):
        glay = QGridLayout()
        self.setLayout(glay)

        hbox1 = QHBoxLayout()       #upper layout for label
        hbox2 = QHBoxLayout()       #bottom layout for buttons

        btn1 = QPushButton("1")
        btn2 = QPushButton("2")
        btn3 = QPushButton("3")

        #adding the buttons to the bottom layout
        hbox2.addWidget(btn1)
        hbox2.addWidget(btn2)
        hbox2.addWidget(btn3)


        label = QLabel("Text")
        hbox1.addWidget(label)

        glay.addLayout(hbox1, 0, 1)
        glay.addLayout(hbox2, 1, 1)
        glay.setRowStretch(0, 1)
        glay.setRowStretch(1, 1)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = Window()
    sys.exit(app.exec_())

【问题讨论】:

【参考方案1】:

在这种情况下,最简单的方法是使用 QWidget 作为容器,因为默认情况下它们的拉伸方式与 QLabel 相同,因此它们会尝试占用相同的空间。

您的初始代码的问题是拉伸因子不适用于布局,但适用于小部件。

最后layout()是一个方法,所以不要隐藏它用于其他事情,函数的名称应该描述方法的动作。

import sys

from PyQt5.QtWidgets import (
    QApplication,
    QHBoxLayout,
    QLabel,
    QPushButton,
    QVBoxLayout,
    QWidget,
)


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(100, 50, 400, 300)
        self.setWindowTitle("Fretboard Note Quiz")

        self.build_layout()

    def build_layout(self):
        btn1 = QPushButton("1")
        btn2 = QPushButton("2")
        btn3 = QPushButton("3")

        label = QLabel("Text")

        button_container = QWidget()
        hlay = QHBoxLayout(button_container)
        hlay.addWidget(btn1)
        hlay.addWidget(btn2)
        hlay.addWidget(btn3)

        vlay = QVBoxLayout(self)
        vlay.addWidget(label)
        vlay.addWidget(button_container)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = Window()
    win.show()
    sys.exit(app.exec_())

【讨论】:

【参考方案2】:

也许您可以将按钮的 minimunHeight 设置为:

ui.pushButton.setMinimumHeight(100)

【讨论】:

以上是关于PyQt5 - 按钮和标签应具有相同的高度的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5:具有相等列宽的布局按钮

Java Swing:具有固定宽度和可变高度的垂直布局

代码中的 UIImageView 和自动布局

如何在 python 中使用 pyqt5 显示 2 个按钮和 2 个标签?

在其他两个之间垂直居中视图

显示更多按钮操作的动态标签和单元格高度