专栏/PyQt6 狠狠级入门3- 布局组件QVBoxLayout与addStretch, QSpacerItem组合使用

PyQt6 狠狠级入门3- 布局组件QVBoxLayout与addStretch, QSpacerItem组合使用

2021年09月16日 18:17--浏览 · --点赞 · --评论
粉丝:27文章:7

QHBoxLayout水平布局相似调用机制,首先按类方法实例化QVBoxLayout,然后将相应控件或者item放入其中。

class QVBoxLayoutExample(QWidget):
    def __init__(self):
        super(QVBoxLayoutExample, self).__init__()
        # 创建垂直布局实例
        self.vertical_layout = QVBoxLayout()
        # 创建三个标签,并将其放入垂直布局控件中
        self.vertical_layout.addWidget(QLabel("垂直一"))
        self.vertical_layout.addWidget(QLabel("垂直二"))
        self.vertical_layout.addWidget(QLabel("垂直三"))
        self.setLayout(self.vertical_layout)  # 将其设为全局布局

运行结果如下:

通过QVBoxLayout演示视频可以看出,相应元素将随窗口的垂直变化而变动。但有时,我们想在利用弹性布局的同时,又想保持三个元素的高不变。为了达到这个目标,我们可以在垂直布局中,加入QSpacerItem控件进行占位,或者利用stretch方法进行占位。

layout_.addItem(QSpacerItem())  # 通过spacerItem控件
layout_.addStretch()  # 利用stretch方法

实例演示

首先,创建第四个QLabel()控件,并将其背景颜色创建为红色后,加入垂直控件容器中。

self.label_4 = QLabel("我是label4,并且以红色为背景色")
self.label_4.setStyleSheet("QLabel{background-color: red;}")
self.vertical_layout.addWidget(self.label_4)

其次,首先,通过QVBoxLayout的addStretch()方法,加入空白区间进行占位。

self.vertical_layout.addStretch(-1)

效果对比图如下,

然后,通过QSpacerItem()达到同样效果。

self.vertical_layout.addItem(QSpacerItem(0, 0, hPolicy=QSizePolicy.Policy.Expanding,vPolicy=QSizePolicy.Policy.Expanding))

可见,后者相对麻烦,常见操作中运用较少,但后者能提供更多操作空间,所以也需要了解。

完整代码:

1- 利用布局控件自身的addStretch()方法

# 首先导入相关包

from PyQt6.QtWidgets import QWidget, QApplication, QVBoxLayout, QLabel, QSpacerItem, QSizePolicy
import sys


# 创建类
class QVBoxLayoutExample(QWidget):
    def __init__(self):
        super(QVBoxLayoutExample, self).__init__()
        # 创建垂直布局实例
        self.vertical_layout = QVBoxLayout()
        # 创建三个标签,并将其放入垂直布局控件中
        self.vertical_layout.addWidget(QLabel("垂直一"))
        self.vertical_layout.addWidget(QLabel("垂直二"))
        self.vertical_layout.addWidget(QLabel("垂直三"))
        self.label_4 = QLabel("我是label4,并且以红色为背景色")
        self.label_4.setStyleSheet("QLabel{background-color: red;}")
        self.vertical_layout.addWidget(self.label_4)
        self.vertical_layout.addStretch(-1)

        self.setLayout(self.vertical_layout)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    v_layout = QVBoxLayoutExample()
    v_layout.setGeometry(200, 200, 300, 400)
    v_layout.setWindowTitle("垂直布局")
    v_layout.show()
    sys.exit(app.exec())

2-利用QSpacerItem()控件

# 首先导入相关包

from PyQt6.QtWidgets import QWidget, QApplication, QVBoxLayout, QLabel, QSpacerItem, QSizePolicy
import sys


# 创建类
class QVBoxLayoutExample(QWidget):
    def __init__(self):
        super(QVBoxLayoutExample, self).__init__()
        # 创建垂直布局实例
        self.vertical_layout = QVBoxLayout()
        # 创建三个标签,并将其放入垂直布局控件中
        self.vertical_layout.addWidget(QLabel("垂直一"))
        self.vertical_layout.addWidget(QLabel("垂直二"))
        self.vertical_layout.addWidget(QLabel("垂直三"))
        self.label_4 = QLabel("我是label4,并且以红色为背景色")
        self.label_4.setStyleSheet("QLabel{background-color: red;}")
        self.vertical_layout.addWidget(self.label_4)
        # self.vertical_layout.addStretch(-1)
        self.vertical_layout.addItem(QSpacerItem(0, 0, hPolicy=QSizePolicy.Policy.Expanding,
                                                 vPolicy=QSizePolicy.Policy.Expanding))
        self.setLayout(self.vertical_layout)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    v_layout = QVBoxLayoutExample()
    v_layout.setGeometry(200, 200, 300, 400)
    v_layout.setWindowTitle("垂直布局")
    v_layout.show()
    sys.exit(app.exec())


投诉或建议