Qt笔记:动态处理多个按钮点击事件以更新UI

问题描述

在开发Qt应用程序时,经常需要处理多个按钮的点击事件,并根据点击的按钮来更新用户界面(UI),如下图。例如,你可能有一个包含多个按钮的界面,每个按钮都与一个文本框和一个复选框相关联。当点击某个按钮时,你希望将该按钮关联的文本框中的文本和复选框的状态更新到主窗口的某个区域。这时,如果每个都定义个信号与槽那样显得我们的代码太冗余了

解决方案

为了解决这个问题,我们可以使用Qt的信号和槽机制,并结合findChild方法来实现动态处理多个按钮的点击事件。

三个关键函数介绍

findChild 是 QObject 类的一个方法,它在 QObject 层次结构中查找具有指定 objectName 的子对象。如果找到匹配的子对象,它会返回该对象的指针;如果没有找到,则返回 nullptr。在 Qt 中,许多控件(如 QPushButtonQLineEdit 等)都继承自 QObject,因此它们都可以使用 findChild 方法。这个方法通常用于在 UI 组件中查找特定的子控件。

sender() 是 Qt 信号和槽机制中的一个方法,当槽函数被调用时,sender() 返回发出信号的对象的指针。这个指针是 QObject* 类型的,因此你可能需要将其转换为更具体的类型(如 QPushButton*)以便使用。

qobject_cast 是一个模板函数,用于在 Qt 的对象层次结构中进行安全的类型转换。如果转换成功,它返回转换后的对象指针;如果转换失败(即对象不是目标类型或其派生类型),则返回 nullptr

示例代码
// 定义一个QList来存储指向QPushButton的指针  
QList<QPushButton*> pushButtons;  
// 循环初始化按钮并连接信号  
for(int i = 1; i < 11; i++){  // 根据i生成按钮的objectName  QString butt = QString("pushButton_%1").arg(i);    // 查找具有指定objectName的QPushButton  QPushButton *pushButton = findChild<QPushButton*>(butt);    // 如果找到了按钮  if(pushButton){  // 为按钮设置一个属性"Id",值为i  pushButton->setProperty("Id", i);    // 将按钮的指针添加到QList中  pushButtons.append(pushButton);      // 连接按钮的clicked信号到clicked_send槽函数  connect(pushButton, SIGNAL(clicked()), this, SLOT(clicked_send()));  }  
}  // clicked_send槽函数,用于处理按钮点击事件  
void Widget::clicked_send() // 对多文本框的优化  
{  // 获取发出信号的按钮  QPushButton* butt = qobject_cast<QPushButton*>(sender());  // 输出按钮指针信息,用于调试  qDebug() << butt;  // 如果按钮存在  if(butt){  // 获取按钮的"Id"属性  int id = butt->property("Id").toInt();  // 输出"Id"属性值,用于调试  qDebug() << id;  // 根据id生成关联的QLineEdit的objectName  QString edit = QString("lineEdit_%1").arg(id);  // 查找具有指定objectName的QLineEdit  QLineEdit* ledit = findChild<QLineEdit*>(edit);   // 如果找到了QLineEdit,则将其文本设置到ui->lineEdit_datas中  if(ledit){  ui->lineEdit_datas->setText(ledit->text());  }  // 根据id生成关联的QCheckBox的objectName  QString check = QString("checkBox_%1").arg(id);    // 查找具有指定objectName的QCheckBox  QCheckBox* checkBox = findChild<QCheckBox*>(check);    // 如果找到了QCheckBox,则将其状态设置到ui->checkBox_HexSend中  if(checkBox){  ui->checkBox_HexSend->setChecked(checkBox->isChecked());  }   // 发送数据on_pushButton_send_clicked();  }  
}

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

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

相关文章

基于springboot+vue+Mysql的逍遥大药房管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

【flutter】 Running Gradle task ‘assembleDebug‘...超时问题

关联搜索&#xff1a;flutter下载gradle失败、AndroidStudio下载gradle失败 构建Flutter项目时遇到控制台一直卡在 Running Gradle task ‘assembleDebug’… 解决方案 1. 修改gradle-wrapper.properties 文件 如果找不到就直接搜索&#xff1a; 把https\://services.gradl…

vscode更改语言,记录一下

首先打开安装好的Vscode软件&#xff0c;可以看到页面上显示的是英文效果。 同时按键ctrlshiftp&#xff0c;接着在输入框中输入 configure Display language如图&#xff1a; 选择中文简体就ok了&#xff0c;如果没有则安装 chinese Language pack

vue3 ElementUI 日期禁选当日前, 当日后,几天后,几天前(例如3天后)

今日之前禁用 代码: ( 主要是 :disabledDate“disabledDateFun” ) <el-date-picker v-model"queryForm.selectedDate"type"date"range-separator"-"placeholder"选择日期":disabledDate"disabledDateFun" clearable /&…

前端面试:项目细节重难点问题分享

面试官提问&#xff1a;我现在给你出一个项目实际遇到的问题&#xff1a;由于后端比较忙&#xff0c;所以我们这边的列表数据排序需要前端最近实现&#xff0c;那你会怎么实现排序呢&#xff1f; 答&#xff1a;我的回答&#xff1a;确实&#xff0c;数据都是由后端实现的&…

基于MetaGPT构建单智能体

前言 在之前的文章中&#xff0c;我们详细地描述了Agent的概念和组成&#xff0c;在代码案例中体验了Agent的记忆、工具、规划决策模块&#xff0c;并通过几个Agent框架来加强读者对Agent开发设计与应用的理解&#xff0c;接下来我们就要进入智能体Agent的实际开发中&#xff0…

教师专属的成绩发布小程序

还在为成绩发布而烦恼&#xff1f;还在担心家长无法及时获得孩子的学习反馈&#xff1f;是否想要一个既安全又高效的工具来简化你的教学工作&#xff1f;那么&#xff0c;易查分小程序可能是你一直在寻找的答案。 现在的老师们有了超多的工具来帮助我们减轻负担&#xff0c;提高…

多式联运奇迹:探索 GPT-4o 的尖端功能

取得的显着进展的DigiOps与人工智能已经标志着重要的里程碑&#xff0c;随着时间的推移塑造了人工智能系统的能力。从早期基于规则系统的出现机器学习和深入学习&#xff0c;人工智能已经发展得更加先进和通用。 生成式预训练 Transformer (GPT) by OpenAI 已特别值得注意。每…

微服务远程调用 RestTemplate

Spring给我们提供了一个RestTemplate的API&#xff0c;可以方便的实现Http请求的发送。 同步客户端执行HTTP请求&#xff0c;在底层HTTP客户端库(如JDK HttpURLConnection、Apache HttpComponents等)上公开一个简单的模板方法API。RestTemplate通过HTTP方法为常见场景提供了模…

Algoriddim djay Pro Ai for Mac:AI引领,混音新篇章

当AI遇上音乐&#xff0c;会碰撞出怎样的火花&#xff1f;Algoriddim djay Pro Ai for Mac给出了答案。这款专业的DJ混音软件&#xff0c;以AI为引擎&#xff0c;引领我们进入混音的新篇章。 djay Pro Ai for Mac的智能混音功能&#xff0c;让每一位DJ都能感受到前所未有的创作…

计算机系统基础 7 分支程序的实现

简单条件转移指令 根据单个标志位的值&#xff08;CF&#xff0c; SF&#xff0c;OF&#xff0c;PF&#xff0c;ZF&#xff09;来确定是否转移&#xff0c; 如果条件成立&#xff0c;则&#xff08;EIP&#xff09; 位移量 ➡ EIP&#xff0c;否则什么也不做。 注意&#xff0…

深度学习500问——Chapter09:图像分割(4)

文章目录 9.10 Mask-RCNN 9.10.1 Mask-RCNN 的网络结构示意图 9.10.2 RCNN行人检测框架 9.10.3 Mask-RCNN 技术要点 9.11 CNN在基于弱监督学习的图像分割中的应用 9.11.1 Scribble 标记 9.11.2 图像级别标记 9.11.3 DeepLabbounding boximage-level labels 9.11.4 统一的框架 9…

作为 App 开发者会推荐安装的 Mac App

Xcode&#xff0c;作为 App 开发者&#xff0c;必须安装的工具。当然&#xff0c;有经验的开发者不会从 Mac App Store 下载&#xff0c;而是从网站下载&#xff0c;除了安装过程更可控&#xff0c;也方便多版本共存。此外&#xff0c;我不信任任何第三方下载方式&#xff1a; …

表面简单实则暗藏玄机的面试题:Java数组适合做队列吗?

Java数组本身是一种线性数据结构&#xff0c;它可以用来存储一系列固定大小的元素。尽管数组可以用于实现队列的一些基本操作&#xff0c;比如入队&#xff08;enqueue&#xff09;和出队&#xff08;dequeue&#xff09;&#xff0c;但由于其固定的大小&#xff0c;它并不适合…

开关电源重点可靠性测试项目与测试方法

为确保开关电源在复杂工作环境下的安全性与稳定性&#xff0c;各种安全性测试成为不可或缺的环节。本文将深入探讨几项关键的安全性测试项目&#xff0c;帮助用户全面了解如何评估开关电源的可靠性和安全性。 一、过压保护测试方法 目的是为了检测当输出电压过高时&#xff0c;…

项目9-网页聊天室2(登录)

0.前端知识储备 Ajax请求中的async:false/true的作用 - front-gl - 博客园 (cnblogs.com) 01.前端页面展示 02.后端代码 2.1 CONTROLLER RequestMapping("/login")public Result login(String username, String password, HttpSession httpSession){User user …

乡村振兴与农村社会治理现代化:加强农村社会治理体系和治理能力现代化建设,提升乡村治理效能,为美丽乡村建设提供坚实保障

一、引言 在全面推进乡村振兴的伟大实践中&#xff0c;农村社会治理现代化是不可或缺的重要一环。随着时代的发展&#xff0c;传统的农村社会治理方式已经无法满足现代社会发展的需求。因此&#xff0c;加强农村社会治理体系和治理能力现代化建设&#xff0c;提升乡村治理效能…

2024年电工杯数学建模竞赛思路资料汇总贴

下文包含&#xff1a;2024电工杯&#xff08;电工杯数学建模竞赛&#xff09;思路解析、电工杯参赛时间及规则信息说明、好用的数模技巧及如何备战数学建模竞赛 C君将会第一时间发布选题建议、所有题目的思路解析、相关代码、参考文献、参考论文等多项资料&#xff0c;帮助大家…

XSS漏洞

漏洞描述 XSS全名叫Cross Site Scripting(跨站脚本攻击)因为简写和css同名所以改名为XSS&#xff0c;该漏洞主要利用javascript可以控制html&#xff0c;css&#xff0c;浏览器的行为从而恶意利用&#xff0c;当开发人员未对输入的内容进行过滤或编码时&#xff0c;恶意用户在…

【Spring security】【pig】Note03-pig token令牌解析器过程

&#x1f338;&#x1f338; pig token令牌解析器过程 &#x1f338;&#x1f338; pig后端源码 一、解析请求中的令牌值。 二、验证令牌 内省并验证给定的令牌&#xff0c;返回其属性。返回映射表示令牌有效。 /*** author lengleng* date 2019/2/1 扩展用户信息*/ publi…