Pyside6:多行按钮点击判断序号

news2024/11/17 0:28:28

在Pyside开发过程中会遇到这么个问题:当多个按钮在很多行中,需要在点击槽函数中确认按钮的行。

普通的按钮点击信号如下:

clicked()

该信号并未有任何参数,无法得到有效的信息,那么如何完成点击哪个确定是哪个按钮呢?

本文将介绍几种方式来实现上面的需求。本文的示例将用下面的界面来举例:

运行画面:

一、自定义按钮(不推荐)

1.1自定义代码

 通过自定义按钮控件,可以实现添加一个自定义信号来添加槽函数的参数:

# -*- coding: utf-8 -*-
from PySide6.QtWidgets import QPushButton
from PySide6.QtCore import Signal


class IndexButton(QPushButton):
    index_clicked = Signal(int)

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.index = 0

    def mousePressEvent(self, event):
        super().mousePressEvent(event)
        self.index_clicked.emit(self.index)

1.2Designer中进行提升

如果使用Designer,别忘了还需要进行按钮的提升才可以使用

1.3测试代码

# -*- coding: utf-8 -*-
from PySide6.QtWidgets import QWidget
from UI.TestPage_ui import Ui_Form


class TestPage(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.ui = Ui_Form()
        self.ui.setupUi(self)

        self.button_list = [
            self.ui.pushButton_0,
            self.ui.pushButton_1,
            self.ui.pushButton_2,
            self.ui.pushButton_3
        ]

        for i, btn in enumerate(self.button_list):
            btn.index = i
            btn.index_clicked.connect(self.clicked)

    def clicked(self, index):
        self.ui.label.setText(f'当前点击了第{index}个按钮')

二、闭包实现

通过闭包的实现也可以完成相应的功能,闭包可以将临时变量保存到内存中。

2.1代码

def block(func, index):
    def inner():
        return func(index)
    return inner

 2.2测试代码

# -*- coding: utf-8 -*-
from PySide6.QtWidgets import QWidget
from UI.TestPage_ui import Ui_Form


class TestPage(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.ui = Ui_Form()
        self.ui.setupUi(self)

        self.button_list = [
            self.ui.pushButton_0,
            self.ui.pushButton_1,
            self.ui.pushButton_2,
            self.ui.pushButton_3
        ]

        def block(func, index):
            def inner():
                return func(index)
            return inner

        for i, btn in enumerate(self.button_list):
            btn.clicked.connect(block(self.clicked, i))

    def clicked(self, index):
        self.ui.label.setText(f'当前点击了第{index}个按钮')

三、lambda加闭包实现

lambda加闭包的形式,其实还是一个闭包,但写法上会比普通闭包来的更简洁。 

3.1代码 

def create_button_callback(index):
    return lambda: self.clicked(index)

 3.2测试代码

# -*- coding: utf-8 -*-
from PySide6.QtWidgets import QWidget
from UI.TestPage_ui import Ui_Form


class TestPage(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.ui = Ui_Form()
        self.ui.setupUi(self)

        self.button_list = [
            self.ui.pushButton_0,
            self.ui.pushButton_1,
            self.ui.pushButton_2,
            self.ui.pushButton_3
        ]

        def create_button_callback(index):
            return lambda: self.clicked(index)

        for i, btn in enumerate(self.button_list):
            btn.clicked.connect(create_button_callback(i))

    def clicked(self, index):
        self.ui.label.setText(f'当前点击了第{index}个按钮')

四、self.sender()的使用(推荐)

在发送信号时,self可以拿到相应的发送者,通过它即可获取所对应的按钮,即可通过将按钮进行列表的包裹来判断下标。

4.1代码

index = self.button_list.index(self.sender())

4.2测试代码

# -*- coding: utf-8 -*-
from PySide6.QtWidgets import QWidget
from UI.TestPage_ui import Ui_Form


class TestPage(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.ui = Ui_Form()
        self.ui.setupUi(self)

        self.button_list = [
            self.ui.pushButton_0,
            self.ui.pushButton_1,
            self.ui.pushButton_2,
            self.ui.pushButton_3
        ]

        for i, btn in enumerate(self.button_list):
            btn.clicked.connect(self.clicked)

    def clicked(self):
        index = self.button_list.index(self.sender())
        self.ui.label.setText(f'当前点击了第{index}个按钮')

五、总结 

对于按钮点击时对应按钮的判断是非常常用的功能,由于普通槽函数不带特定参数很难实现相应功能,因此如果比较特殊的参数可以通过自定义控件来完成,如果比较简单如下标即可通过self.sender(),如果无法使用self.sender()来获取内容,又不想自定义控件,闭包是不错的选择。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1619988.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分类预测 | Matlab实现RIME-BP霜冰优化BP神经网络多特征分类预测

分类预测 | Matlab实现RIME-BP霜冰优化BP神经网络多特征分类预测 目录 分类预测 | Matlab实现RIME-BP霜冰优化BP神经网络多特征分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.RIME-BP霜冰优化BP神经网络多特征分类预测(Matlab实现完整源码和数据&a…

Linux SDIO-WiFi 协议栈

Linux SDIO-WiFi 协议栈 1. 简介2. BCMDHD2.1 WiFi模组2.2 驱动初始化(dhd_module_init) 3. Broadcom fullmac WLAN 1. 简介 2. BCMDHD BCMDHD:Broadcom Dongle Host DriverSIP:System In Package 2.1 WiFi模组 2.2 驱动初始化…

条件生成对抗网络(cGAN)在AI去衣技术中的应用探索

随着深度学习技术的飞速发展,生成对抗网络(GAN)作为其中的一个重要分支,在图像生成、图像修复等领域展现出了强大的能力。其中,条件生成对抗网络(cGAN)通过引入条件变量来控制生成模型的输出&am…

互联网大厂ssp面经,数据结构part3

1. 哈希表的原理是什么?如何解决哈希碰撞问题? a. 原理:通过哈希函数将每个键映射到一个唯一的索引位置,然后将值存储在对应索引位置的存储桶中。 b. 关键:将不同的键映射到不同的索引位置,以实现快速的插…

Spring Boot 集成 EasyExcel 3.x

Spring Boot 集成 EasyExcel 3.x Spring Boot 集成 EasyExcel 3.x 本章节将介绍 Spring Boot 集成 EasyExcel(优雅实现Excel导入导出)。 🤖 Spring Boot 2.x 实践案例(代码仓库) 介绍 EasyExcel 是一个基于 Java 的、…

社交的神奇好处你都知道吗?

聊天交友软件是人们日常生活中不可或缺的一部分,有些需要花费大量金钱才能享受完整的功能,但也有一些不需要花费金钱的聊天交友软件,如微信、QQ等。这些软件提供了多种交流方式,让用户可以方便地结识新朋友、扩大社交圈子&#xf…

基于SpringBoot的合家云社区物业管理平台 - 项目介绍

合家云社区物业管理平台 2.合家云需求&设计 2.1 项目概述 2.1.1 项目介绍 合家云社区物业管理平台是一个全新的 ”智慧物业解决方案“,是一款互联网的专业社区物业管理系统。平台通过社区资产管理、小区管理、访客管理、在线报修、意见投诉等多种功能模块&a…

游戏陪玩系统app

游戏陪玩系统APP为用户提供了一个便捷的平台,让他们能够轻松找到合适的陪玩者,一同享受游戏的乐趣。以下是对您提到的功能的详细解释: 游戏约玩: 在陪玩APP上,用户可以浏览陪玩者的信息,包括他们的游戏技能…

YOLOv8 训练自己的数据集(20240423)

环境搭建请参考:Win10 搭建 YOLOv8 运行环境(20240423)-CSDN博客 环境测试请参考:本地运行测试 YOLOv8(20240423)-CSDN博客 一、使用 YOLOv8 的 coco128 数据集熟悉一下如何训练和预测 1.1、在项目根目录…

新的ChatGPTPlus(GPT4)支付渠道?怎么付费充值?

GPT4多少钱一个月 GPT4一个20美元。作为最优秀的语言模型之一,GPT-4为您带来无与伦比的生产力体验。 除了出色的自然语言处理能力,GPT-4还引入了创新的代码解释器功能和强大的插件扩展,进一步提升了您的工作效率和创造力。 代码解释器功能&…

excel一列同乘同一个数

excel一列同乘同一个数 第一种方法(excel本身功能) 在空白区域输入要乘以的数,比如0.5 右键选择复制 选中需要乘以的单元格,选择性粘贴 点击乘,选择确定 删除0.5后也不会改变值 第二种方法(方方格子…

LLama的激活函数SwiGLU 解释

目录 Swish激活函数 1. Swish函数公式 LLaMA模型中的激活函数 1. SwiGLU激活函数 2. SwiGLU激活函数的表达式 3. SwiGLU激活函数的优势 Swish激活函数 Swish是一种激活函数,其计算公式如下: 1. Swish函数公式 Swish(x) x * sigmoid(x) 其中&am…

开源协议的对比和商业上的安全使用

开源协议的对比和商业上的安全使用 开源组件是:“任何人都可以自由使用、更改和共享(以修改或未修改的形式)的软件”。当今企业依靠开源来加速开发、降低成本和推动创新。对开放源码的糟糕管理可能会使组织面临安全、法律和操作风险。 使用…

【Python】爬虫-基础入门

目录 一、什么是爬虫 二、爬虫的主要用途 三、学会爬虫需要掌握的技能 四、爬虫使用的语言 五、编写爬虫需要的库,以python为例 六、爬虫示例-python 示例一 示例二 示例三 一、什么是爬虫 爬虫,又称网络爬虫或网页爬虫,是一种用来自…

解读DreamFusion:一个引人注目的AI生成内容领域的项目

什么是DreamFusion? DreamFusion使用2D扩散模型来实现文本到3D生成的任务。这项技术在ICLR 2023上获得了杰出论文奖,并成为了许多科研工作的基准。 简而言之,DreamFusion的目标是在没有3D数据监督的情况下,利用已有的2D生成模型根…

11 JavaScript学习:事件

Html事件 HTML 中有很多事件可以用来与用户交互&#xff0c;以下是一些常见的 HTML 事件及其详细解释和举例&#xff1a; click 事件&#xff1a;当用户点击元素时触发。 <button onclick"myFunction()">点击我</button>dblclick 事件&#xff1a;当用…

【二】ECharts----【异步加载数据】

目录 零.前言 一.异步加载数据 1.1简介 1.1.1一个使用$.get()获取json数据并加载的例子 1.2数据的动态更新【重要】 1.2.1一个使用random随机生成的动态更新 完整代码如下&#xff1a; 二.加载中动画 零.前言 【一】ECharts----【基本概念、基本实例】-CSDN博客 一.…

锐捷网络闪耀高博会:智慧教育数字基座引领教育数字化新浪潮

4月15日,第61届中国高等教育博览会(简称“高博会”)在福州盛大开幕,在这次教育高端装备展示、教学改革成果交流、校企云集的行业盛会上,围绕构建智慧教育数字基座,锐捷网络携全场景智慧教育方案亮相,极简以太全光网、高校桌面云、5G多网融合等创新方案纷纷登场,吸引了众多观众驻…

护眼台灯什么牌子好一点?护眼灯合格的品牌分享

护眼台灯作为对抗视力挑战的一种方法&#xff0c;逐渐赢得了众多家长的青睐。这些台灯利用尖端光学技术&#xff0c;发出柔和且无刺激的照明&#xff0c;有助于保护眼睛不受伤害。它们不但可以调节亮度和色温&#xff0c;打造一个舒适且自然的阅读环境&#xff0c;还有利于提升…

PHP命令执行漏洞CVE-2024-1874复现

CVE-2024-1874 PHP命令执行漏洞 影响版本 Affected versions < 8.1.28 < 8.2.18 < 8.3.5 Patched versions 8.1.28 8.2.18 8.3.6 POC 创建一个文件test.php <?php $descriptorspec [STDIN, STDOUT, STDOUT]; $proc proc_open(["test.bat", "\&…