pyqt 循环添加按钮,确定位置

文章介绍了在PyQt5中如何在循环中创建具有不同功能的按钮。通过设置每个按钮的objectName并在点击事件中比较sender(),实现了根据按钮名称确定被点击的按钮,从而绑定正确的函数,而无需依赖按钮的文字内容。
摘要由CSDN通过智能技术生成

在循环创建相同的widget模板的时候,如何确定其中的按钮,或者说如何让每个按钮绑定到正确的函数?找了许多教程完成这个思路,记录一下。

首先是通过sender获取按钮信息是肯定的,参考:

(58条消息) PyQt5 QTableWidget添加多个按钮,并确定其位置_pyqt5 获取表中按钮定位_aj__Live_boldly的博客-CSDN博

这种方法需要在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的时候给每个按钮设置了名字,之后点击按钮遍历这十个按钮,发现按钮与发送信号的按钮一致则找到该按钮,这种方法可以做到不需要对按钮文字进行更改。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值