在循环创建相同的widget模板的时候,如何确定其中的按钮,或者说如何让每个按钮绑定到正确的函数?找了许多教程完成这个思路,记录一下。
首先是通过sender获取按钮信息是肯定的,参考:
(58条消息) PyQt5 QTableWidget添加多个按钮,并确定其位置_pyqt5 获取表中按钮定位_aj__Live_boldly的博客-优快云博
这种方法需要在table中实现,只设置一列然后拉宽拉高也能完成需求,但有较高的排版要求。我的想法是画个ui然后循环创建widget,同时对ui里的控件进行更改。
代码:
def createwidgets(self):
w = QWidget()
l = QVBoxLayout()
for i in range(10):
ui = uic.loadUi("../ui/item.ui") # 通过ui获取模板
ui.setFixedSize(200, 100)
ui.button.setText(str(i+1)) # 设置每个按钮上的文字
ui.button.clicked.connect(self.gettext)
l.addWidget(ui)
w.setLayout(l)
self.ui.setWidget(w) # 注意这里的ui是主页面的ui文件,类型是QWidget
def gettext(self):
print(self.ui.sender().text()) # 同上
实现:
结果:
很容易实现,但是按钮上的文字不是想要的,想过改boder-image,但是文字还是存在,这里可能改文字透明也是一种思路,但是没找到仅仅改文字透明的方法。
最后解法思路是在创建widget时给每个button设置名字(setObjectName方法),在获取到sender后与该名字的按钮进行比对。
代码:
def createwidgets(self):
w = QWidget()
l = QVBoxLayout()
for i in range(10):
ui = uic.loadUi("../ui/item.ui") # 通过ui获取模板
ui.setFixedSize(200, 100)
ui.button.setText('按钮') # 设置每个按钮上的文字
ui.button.clicked.connect(self.gettext)
ui.button.setObjectName(str(i + 1)) # 注意:这里设置每个按钮的名字
l.addWidget(ui)
w.setLayout(l)
self.ui.setWidget(w) # 注意这里的ui是主页面的ui文件,类型是QWidget
def gettext(self):
# print(self.ui.sender().text()) # 同上
for i in range(10):
if self.ui.findChild(QPushButton, str(i + 1)) == self.ui.sender():
print('按钮被点击:', i + 1)
createwidgets函数创建widget的时候给每个按钮设置了名字,之后点击按钮遍历这十个按钮,发现按钮与发送信号的按钮一致则找到该按钮,这种方法可以做到不需要对按钮文字进行更改。