Pyside6:Spacer的使用,布局中控件顶格添加

在普通的布局,如水平或纵向布局中,我们的控件都会保持中间状态,如下:

但有许多情况下 ,我们需要将控件布局为如下界面:

在前端开发时,我们很容易通过flex来进行布局,修正它的居中或者从头或者从尾,但在QT中并不是通过样式表完成,而是使用一种Spacer的控件完成,它的样子如同弹簧一般:

一、QT中的操作

非常简单的操作,仅需要在布局中将Spacer拉入即可完成从上往下或者从下往上的布局:

从左向右或者从右向左也是类似操作:

二、代码中动态添加控件 

如果希望在代码中动态为布局中添加控件也很简单,我们使用如下的布局,然后按一下添加按钮不停往下动态添加:

2.1确定layout

首先我们需要知道我们需要动态添加的layout在哪里,例如我们这个示例中的layout叫做verticalLayout:

2.2使用代码添加

# -*- coding: utf-8 -*-
from PySide6.QtWidgets import QWidget, QPushButton
from UI.TestPage_ui import Ui_Form


class TestPage(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.ui = Ui_Form()
        self.ui.setupUi(self)

        self.index = 0

    def click_add(self):
        btn = QPushButton()
        btn.setText(f'第{self.index}个按钮')
        self.ui.verticalLayout.addWidget(btn)

        self.index += 1

测试结果:

可以看到结果有悖理论想法,主要原因是我们的添加是在Spacer下方进行了添加,如果在Designer中显示就应该如下:

因此在动态添加时,不可直接使用 addWidget,而是使用insertWidget。

2.3最终代码

# -*- coding: utf-8 -*-
from PySide6.QtWidgets import QWidget, QPushButton
from UI.TestPage_ui import Ui_Form


class TestPage(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.ui = Ui_Form()
        self.ui.setupUi(self)

        self.btn_list = []

    def click_add(self):
        btn = QPushButton()
        btn.setText(f'第{len(self.btn_list)}个按钮')
        self.ui.verticalLayout.insertWidget(len(self.btn_list) + 1, btn)
        self.btn_list.append(btn)

测试如下:

三、总结 

在界面设计中控件需要顶格处理的情况非常多,因此熟练使用Spacer来处理相关问题很重要,这里不得不吐槽还是css中的flex好用多了。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PySide6 ,QCheckBox 控件本身不支持下拉菜单,但可以通过在 QCheckBox 控件旁边添加一个 QPushButton 控件,并在 QPushButton 控件添加下拉菜单来实现类似功能。具体步骤如下: 1. 创建一个 QCheckBox 控件和一个 QPushButton 控件,并将它们放在同一个布局。 ```python checkbox = QtWidgets.QCheckBox("Checkbox") button = QtWidgets.QPushButton("Dropdown") layout = QtWidgets.QHBoxLayout() layout.addWidget(checkbox) layout.addWidget(button) ``` 2. 创建一个 QMenu 控件,并在其添加需要的 QAction 控件。 ```python menu = QtWidgets.QMenu() action1 = menu.addAction("Action 1") action2 = menu.addAction("Action 2") ``` 3. 将 QPushButton 控件的 clicked 信号连接到一个槽函数,在槽函数显示 QMenu 控件。 ```python def show_menu(): menu.exec_(button.mapToGlobal(QtCore.QPoint(0, button.height()))) button.clicked.connect(show_menu) ``` 4. 当用户选择 QMenu 的一个 QAction 控件时,更新 QCheckBox 控件的文本。 ```python def set_checkbox_text(action): checkbox.setText(action.text()) action1.triggered.connect(set_checkbox_text) action2.triggered.connect(set_checkbox_text) ``` 完整示例代码如下: ```python from PySide6 import QtCore, QtWidgets class MainWindow(QtWidgets.QMainWindow): def __init__(self): super().__init__() self.init_ui() def init_ui(self): checkbox = QtWidgets.QCheckBox("Checkbox") button = QtWidgets.QPushButton("Dropdown") layout = QtWidgets.QHBoxLayout() layout.addWidget(checkbox) layout.addWidget(button) menu = QtWidgets.QMenu() action1 = menu.addAction("Action 1") action2 = menu.addAction("Action 2") def show_menu(): menu.exec_(button.mapToGlobal(QtCore.QPoint(0, button.height()))) button.clicked.connect(show_menu) def set_checkbox_text(action): checkbox.setText(action.text()) action1.triggered.connect(set_checkbox_text) action2.triggered.connect(set_checkbox_text) central_widget = QtWidgets.QWidget() central_widget.setLayout(layout) self.setCentralWidget(central_widget) if __name__ == "__main__": app = QtWidgets.QApplication([]) window = MainWindow() window.show() app.exec_() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值