当前位置: 首页 > news >正文

pyqt 按钮自动布局方案

pyqt 按钮自动布局方案

  • 效果展示
  • 支持功能
  • 核心代码实现

效果展示

在这里插入图片描述

支持功能

  • 添加、编辑、删除按钮
  • 根据界面大小自动调节按钮布局

核心代码实现

资源下载

from PyQt5.QtWidgets import QWidget, QMenu, QPushButton, QInputDialog, QSpacerItem, QSizePolicy, QAction, QLineEdit
from PyQt5.QtCore import Qt, pyqtSignal
from PyQt5.QtGui import QCursor
from flowbtnwidget import Ui_Form

class FlowBtnWidgetMng(QWidget, Ui_Form):
    btnClicked = pyqtSignal(str)
    def __init__(self, parent=None):
        super(FlowBtnWidgetMng, self).__init__(parent)
        self.setupUi(self)
        self.btnList = []
        self.context_menu = QMenu(self)
        self.addMenu(["添加按钮"])

        for i in range(10):
            btnName = "按钮"*(i + 1) + "%s" %(i)
            self.addBtn(btnName)

    def contextMenuEvent(self, event):
        self.context_menu.exec(event.globalPos())

    def resizeEvent(self, event):
        self.update()

    def addMenu(self, menuList):
        for one in menuList:
            action = self.context_menu.addAction(one)
            action.triggered.connect(self.slotMenuTriggered)

    def slotMenuTriggered(self):
        btn = self.sender()
        text = btn.text()
        if text == "添加按钮":
            name, ok = QInputDialog.getText( self, '添加按钮', '按钮名')
            if ok:
                self.addBtn(name)

    def addBtn(self, btnName):
        pushButton = QPushButton(btnName)
        pushButton.clicked.connect(self.slotBtnClicked)
        pushButton.setContextMenuPolicy(Qt.CustomContextMenu)
        pushButton.customContextMenuRequested.connect(self.slotBtnMenuShow)
        self.btnList.append(pushButton)
        self.update()

    def slotBtnClicked(self):
        self.btnClicked.emit(self.sender().text())

    def slotBtnMenuShow(self):
        btn = self.sender()
        btnMenu = QMenu(self)
        for oneMenu in ["编辑按钮", "删除按钮"]:
            action = QAction(oneMenu, btn)
            btnMenu.addAction(action)
            action.triggered.connect(self.slotBtnMenuOp)
        btnMenu.popup(QCursor.pos())

    def slotBtnMenuOp(self):
        text = self.sender().text()
        btn = self.sender().parent()
        if text == "编辑按钮":
            name, ok = QInputDialog.getText(self, '编辑按钮', '按钮名', QLineEdit.EchoMode.Normal, text = btn.text())
            if ok:
                btn.setText(name)
        elif text == "删除按钮":
            self.btnList.remove(btn)
            btn.deleteLater()
        self.update()

    def update(self):
        if not self.btnList:
            return

        for _ in range(self.btnLayout.count()):
            self.btnLayout.takeAt(0)

        maxWidth = self.width()
        rowWidgetNum = 1
        while True:
            groupMaxWidth = 0
            for group in range(0, rowWidgetNum):
                groupWidth = 0
                for index in range(group, len(self.btnList), rowWidgetNum):
                    groupWidth = max(groupWidth, self.btnList[index].sizeHint().width())
                groupMaxWidth += groupWidth
            if groupMaxWidth > maxWidth:
                rowWidgetNum -= 1
                break
            elif len(self.btnList) <= rowWidgetNum:
                break
            rowWidgetNum += 1
        if rowWidgetNum == 0:
            rowWidgetNum = 1

        for index, oneBtn in enumerate(self.btnList):
            self.btnLayout.addWidget(oneBtn, index / rowWidgetNum, index % rowWidgetNum, 1, 1)

        if len(self.btnList) == rowWidgetNum or rowWidgetNum == 1:
            self.btnLayout.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum), 0, rowWidgetNum, 1, 1)
        self.btnLayout.addItem(QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding), (index / rowWidgetNum) + 1, 0, 1, 1)

相关文章:

  • Hadoop•常用命令
  • LS-NET-006-思科MDS 9148S 查看内存
  • Python:多态,静态方法和类方法
  • golang 生成单元测试报告
  • 目标检测——清洗数据
  • Java 填充 PDF 模版
  • Python个人学习笔记(18):模块(异常处理、traceback、日志记录)
  • MAC-在使用@Async注解的方法时,分布式锁管理和释放
  • STM32原理性知识
  • 一种基于大规模语言模型LLM的数据分析洞察生成方法
  • 如何在 Node.js 中使用 .env 文件管理环境变量 ?
  • Rust嵌入式开发环境搭建指南(基于Stm32+Vscode)
  • ASP3605同步降压调节器——满足汽车电子严苛要求的电源芯片方案
  • 数学之握手问题
  • Java替换jar包中class文件
  • Matlab概率区间预测全家桶更新了,新增光伏出力区间预测,4种分布可供预测
  • 【单片机通信技术应用——学习笔记三】液晶屏显示技术,取模软件的应用
  • AI重构工程设计、施工、总承包行业:从智能优化到数字孪生的产业革命
  • 【C++】八大常见的设计模式的实现与实践指南
  • Flink 内存管理
  • 甘肃省原副省长赵金云被开除公职,甘肃省委表态:坚决拥护党中央决定
  • 铜钴巨头洛阳钼业一季度净利润同比大增九成,最新宣布首度进军黄金矿产
  • 韩国对华中厚板征收临时反倾销税
  • 吏亦有道|秦汉的发明家与技术传承
  • 全国党委和政府秘书长会议在京召开,蔡奇出席并讲话
  • 中国海警登临铁线礁开展维权行动并展示五星红旗