PyQt布局细节:界面空间分配和组件间距的关键——弹簧(Spacer)

在 PyQt(以及整个 Qt 框架)中,“弹簧”(spacer)是一个用于在布局中管理额外空间或填充的组件。它们用于控制组件之间的间距,以及如何在容器中分配额外的空间。在 PyQt 中,弹簧通常通过 QSpacerItem 类来实现。QSpacerItem 是一个可以放在布局中的特殊项,它不包含任何可视的组件,但会占用一定的空间。可以通过指定其大小和扩展策略来控制这个空间的大小和行为。

先看组件放置的默认效果

在这里插入图片描述

再看放置弹簧后的效果

在这里插入图片描述

通过在水平布局的按钮容器和滚动条右侧放置弹簧,把两者推到窗口左端

重点

        # 创建弹簧
        spacer_v1 = QSpacerItem(100, 50, QSizePolicy.Expanding, QSizePolicy.Expanding)  
        # 添加到主布局
        main_layout.addItem(spacer_v1) 

弹簧的尺寸策略(QSizePolicy):QSizePolicy.Expanding 会使得弹簧尽可能地扩展,而 QSizePolicy.Fixed 则会保持其大小不变。

完整代码

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
"""
创建弹簧
"""
class MainWindow(QMainWindow):  
    def __init__(self):  
        super().__init__() 
        self.initUI()   

    def initUI(self): 
  
        # 设置窗口标题和大小  
        self.setWindowTitle("示例")  
        self.setGeometry(300, 150, 400, 600) 
  
        # 创建主布局  
        main_layout = QHBoxLayout()  
  
        # 创建 button_container 并设置其布局  
        button_container = QWidget()  
        button_container.setFixedSize(120, 600)
        button_container.setStyleSheet("QWidget { border: 1px solid blue; }")  

        button_layout = QVBoxLayout()
        button_layout.setContentsMargins(0, 0, 0, 0)  # 设置布局边距为0  
        button_layout.setAlignment(Qt.AlignLeft | Qt.AlignTop)  # 将内容对齐到右上角  
        button_layout.setSpacing(0)  # 设置控件之间的间距为0,以确保按钮紧贴    
         
        self.buttons = [QPushButton(f'Button {i+1}') for i in range(10)]      
        # 将按钮添加到垂直布局  
        for button in self.buttons: 
            button.setFixedSize(120, 100)  
            button_layout.addWidget(button)  
        # 初始时只显示前5个按钮  
        for i, button in enumerate(self.buttons[5:]):  
            button.hide()  
  
        button_container.setLayout(button_layout) 

        scrollbar = QScrollBar(Qt.Vertical)
        scrollbar.setFixedWidth(10) 
        scrollbar.setRange(0, 1)    
        scrollbar.setValue(0)
        scrollbar.valueChanged.connect(self.updateButtonDisplay)  # 连接滚动条值改变信号  

        # 创建弹簧
        spacer_v1 = QSpacerItem(100, 50, QSizePolicy.Expanding, QSizePolicy.Expanding)  
  
        # 添加到主布局
        main_layout.addWidget(button_container)  
        main_layout.addWidget(scrollbar) 
        main_layout.addItem(spacer_v1)
  
        # 设置中央部件的布局  
        central_widget = QWidget()  
        central_widget.setLayout(main_layout)  
        self.setCentralWidget(central_widget)  

    def updateButtonDisplay(self, value):  
        offset = value * 5  # 计算当前应该显示的按钮组的索引 
        for i, button in enumerate(self.buttons):  
            # 显示当前按钮组,隐藏其他按钮组  
            if i >= offset and i < offset + 5:  
                button.show()  
            else:  
                button.hide() 

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

有用点赞收藏加关注~

相关推荐

  1. 地理处理空间分析关键技巧

    2024-03-29 11:46:02       31 阅读
  2. 详细学习Pyqt5中2种弹簧

    2024-03-29 11:46:02       44 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-29 11:46:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-29 11:46:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-29 11:46:02       82 阅读
  4. Python语言-面向对象

    2024-03-29 11:46:02       91 阅读

热门阅读

  1. Vue如何实现自定义组件改变组件背景色?

    2024-03-29 11:46:02       41 阅读
  2. 关于gson解析把int类型转成浮点型的问题

    2024-03-29 11:46:02       37 阅读
  3. TCP/IP参考模型(四层及其解析)

    2024-03-29 11:46:02       42 阅读
  4. MySQL学习必备SQL_DDL_DML_DQL

    2024-03-29 11:46:02       43 阅读
  5. vue.js 开发如何应用“软件工程“的原则?

    2024-03-29 11:46:02       38 阅读
  6. ARM day8作业

    2024-03-29 11:46:02       38 阅读
  7. 完整的FPGA设计流程包括哪些?

    2024-03-29 11:46:02       50 阅读
  8. 微信小程序预先加载服务器的图片

    2024-03-29 11:46:02       37 阅读
  9. 十一、Spring源码学习之registerListeners方法

    2024-03-29 11:46:02       30 阅读
  10. FFMPEG对于处理rtp流出现马赛克问题处理

    2024-03-29 11:46:02       43 阅读
  11. Linux curl 类似 postman 直接发送 get/post 请求

    2024-03-29 11:46:02       41 阅读
  12. 大数据导论-大数据分析——沐雨先生

    2024-03-29 11:46:02       38 阅读
  13. 一些常见的zookeeper问题和答案

    2024-03-29 11:46:02       48 阅读