做网站很赚钱吗网店代运营可靠吗
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_Formclass 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:returnfor _ in range(self.btnLayout.count()):self.btnLayout.takeAt(0)maxWidth = self.width()rowWidgetNum = 1while True:groupMaxWidth = 0for group in range(0, rowWidgetNum):groupWidth = 0for index in range(group, len(self.btnList), rowWidgetNum):groupWidth = max(groupWidth, self.btnList[index].sizeHint().width())groupMaxWidth += groupWidthif groupMaxWidth > maxWidth:rowWidgetNum -= 1breakelif len(self.btnList) <= rowWidgetNum:breakrowWidgetNum += 1if rowWidgetNum == 0:rowWidgetNum = 1for 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)