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)