(二十三)槽函数的书写规则导致槽函数触发2次的问题

2023-10-27

在创建QT的信号和槽时,经常无意间保留着QT书写槽函数的习惯,或者在QT设计界面直接右键【转到槽】去创建槽函数,但是后期需要用到disconnect时,又重新写了一遍connect函数,那么你会发现实际槽函数执行了2遍。

首先来看下这种QT的槽函数书写习惯:void on__();
例如,我创建了一个lineEdit,并且给这个控件的oeject name命名为lineEdit,那么这个lineEdit的textChanged信号对应的默认槽函数就是:
void on_lineEdit_textChanged(QString text);
那么这种命名方式有什么问题呢?首先看下这个代码:

void MainWindow::on_lineEdit_textChanged(QString text)
{
    count ++;//一个自增的int值
    qDebug() << count;
    ui->label->setText(text);//一个label来显示text变化
}

很明显这个命名规则是符合QT命名规则的,那么我们此时不去创建connect,仅仅去emit一个signal会发生什么呢?

emit ui->lineEdit->textChanged("test");

在这里插入图片描述
可以明显看到label的test发生了变化。

我们再做一个实验,新增一个connect去试下槽函数执行了几次:

connect(ui->lineEdit, &QLineEdit::textChanged, this, &MainWindow::on_lineEdit_textChanged);

在这里插入图片描述
可以看到实际槽函数执行了2遍,这就不符合我们的实际需求了。

我们来看下为什么呢?点击进去ui_文件中,你可以看到这一句函数:

QMetaObject::connectSlotsByName(MainWindow);

QT对此做了解释:
Searches recursively for all child objects of the given object, and connects matching signals from them to slots of object that follow the following form:
void on_();
Let’s assume our object has a child object of type QPushButton with the object name button1. The slot to catch the button’s clicked() signal would be:
void on_button1_clicked();
递归搜索给定对象的所有子对象,并将来自这些子对象的匹配信号连接到遵循以下形式的对象槽
可以看到QT会去搜索所有的对象,并且把这些子对象的信号连接到符合void on
_()形式的槽函数上,并且这种连接是自动的!!!!
难怪我们自己connect以后,槽函数会执行2遍,因为QT帮助我们自动connect了一次。

为了避免这种方式的错误,那么我们最好在写槽函数的时候,不要遵守QT的槽函数明明方式,最简单的就是不要加on_;或者如果想用QT自带的信号槽,那就不要多于的去connect。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(二十三)槽函数的书写规则导致槽函数触发2次的问题 的相关文章

  • Qt 对象的生命周期

    Qt 对象的生命周期是多少 Such as QTcpSocket socket new QTcpSocket 套接字什么时候会被销毁 我应该使用 delete socket 有什么区别吗 QTcpSocket socket 我找不到有关此的
  • 无法隐藏 QMenu 对象 QMenu::setVisible()?

    我已经建立了一个QMenu MainMenu在我的上面MainWindow在我的应用程序中 大家都习惯了 我有以下QMenu主菜单 文件 编辑 SuperHeavyExpertMenus 设置 帮助 我想隐藏子树SuperHeaverExp
  • 无法初始化静态QList?

    我收到以下错误 Cube cpp 10 error expected initializer before lt lt token 以下是头文件的重要部分 ifndef CUBE H define CUBE H include
  • 如何管理返回到 QML 的动态分配的 QObject 的生命周期?

    我有这个代码 QVariant componentFromCode QString code QQmlComponent component new QQmlComponent engine engine gt setObjectOwner
  • 一个阻塞但非模态的 QDialog?

    我有一堆图像 我想对其执行一些操作 处理完每个图像后 我的程序应该弹出一个对话框 提示用户是否要继续处理下一个图像或中止 在此之前 他们应该有机会对图像或参数进行一些手动更改 无论如何 他们必须能够访问应用程序的窗口 而调用对话框的方法的执
  • 如何设置 Xcode 来代替 Qt Creator 工作?

    我不使用 Qt Creator 的 UI 设计功能 对于一个新项目 我想体验一下使用 Xcode 的工作 这将是一个常规的 Qt 项目 使用 C 和 Qt 库开发 就像在 Qt Creator 中一样 我没有使用 OS X 尤其是 Xcod
  • Qt、PushButton、id 属性?有什么方法可以知道点击了哪个按钮

    void MainWindow addRadioToUI int button cunter 4 while database isEmpty button cunter QPushButton one new QPushButton Pl
  • 获取小部件的背景颜色 - 真的

    我无法获取小部件的实际背景颜色 在我的特殊情况下 我在使用 QTabWidget 中的小部件时遇到问题 这是在Windows7上 因此 经典的小部件有一些灰色背景 而选项卡内的小部件通常用白色背景绘制 I tried def bgcolor
  • 对齐坐标系

    Let s say I have 2 coordinate systems as it is shown in image attached 如何对齐这个坐标系 我知道我需要将第二个坐标系围绕 X 平移 180 度 然后将其平移到第一个坐标
  • qt项目如何设置安装路径

    我正在寻找与 qmake configure prefix 等效的内容 基本上 我想覆盖默认的安装 部署目录 这是如何用命令行 qmake 指定的 我还使用 QtCreator 构建了很多 gui 项目 并且我想知道如何在 QtCreato
  • Qt 支持在 QIcon 中为 SVG 着色

    看来 Qt 不支持 SVG 中路径标签上的描边 填充选项
  • Qt程序部署到多平台,如何?

    我是 Qt 编程新手 我想开发一个程序 我想在 Windows Linux ubuntu 和 Mac 上运行 听说Qt支持多平台应用程序开发 但我的问题是 在我部署或编译后 任何 Qt 库都需要在 Ubuntu 中运行这个应用程序吗 如果您
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • 使用 cmake 将两种解决方案合二为一

    我有两个单独的 Visual Studio 2013 解决方案 我想将它们迁移到一个解决方案中 因为第一个解决方案 使用 Qt 充当第二个解决方案的 GUI 最后 我希望有一个结构如下的单一解决方案 Solution All Build P
  • 当我尝试构建 Qt 4.7.1 静态库时,“找不到 -ljscore”

    我尝试从最新的源构建静态 Qt 库 但出现以下错误 usr bin ld cannot find ljscore collect2 ld returned 1 exit status 如何解决这个问题呢 这是 Qt 构建系统中自 4 7 0
  • QT/QML Android App,点击通知栏时打开应用程序

    我为 Android 应用程序制作了一个 QT 当我单击平板电脑中上面看到的按钮通知栏时 但是 如果单击通知 我的应用程序将打开 聚焦 不知道 并显示黑色窗口 简单来说怎么做呢 我的代码是 package org ays operation
  • GoQt 致命错误:QAbstractAnimation:没有这样的文件或目录

    我尝试编译 Qt 来开发桌面应用程序 我按照 Qt 网站上的官方 wiki 指南的说明进行操作 当我尝试go run示例文件夹中的示例 我收到错误 去运行 home pinkya rabbit workspace go1programs s
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • 重定向 python 交互式帮助()

    我正在为使用 Qt 的应用程序开发交互式 python shell 但是我似乎无法获得重定向的交互式帮助 我的 python 代码中有这个 class OutputCatcher def init self self data def wr
  • 如何在 Qt 中以编程方式制作一条水平线

    我想弄清楚如何在 Qt 中制作一条水平线 这很容易在设计器中创建 但我想以编程方式创建一个 我已经做了一些谷歌搜索并查看了 ui 文件中的 xml 但无法弄清楚任何内容 ui 文件中的 xml 如下所示

随机推荐

  • SQL Server(MMS)开启代理服务器(agent)方法(本篇版本展示界面为SQLserver2014)

    第一步 在SQL Server Management Studio中连接到SQL Server实例后 会显示 SQL Server 代理 节点 如果当前该实例的Agent服务没有启动 SQL Server 代理 后边就会显示 已禁用代理XP
  • libcurl库及curl API的简介

    目录 一 libcurl简介 二 curl API简介 三 库安装编译方法 内容来源 Http协议之libcurl实现 谢呈勖 博客园 cnblogs com 一 libcurl简介 libcurl是一个跨平台的网络协议库 支持http h
  • JAVA Eclipse连接SQL Server 2019并从数据库中读取表中数据

    一 进入SQL Server 配置登录名和密码 这里有默认的sa 一开始是禁用的 选中sa 右键 属性 1 授予and启用 2 设置登录名和密码 点击确定 然后关闭SQL 重新进入的时候身份验证选择SQL Server身份验证 二 新建一个
  • maven 配置多镜像

    1 配置maven的setting xml
  • Activity之任务和返回栈

    一个应用程序中会有多个activity 每个activity一般都有自己独立的功能 我们可以用activity启动自己应用中的另一个activity 例如 从一个数据列表界面 跳转到一个数据详情界面 也可以用我们的activity去打开其他
  • 深入理解javascript对象

    理解对象 对象被定义为一组属性的无序集合 对象就是一组没有特定顺序的值 对象的每个value值都由一个key来标识 一个key映射一个value值 1 Object 创建对象 创建了一个名为 person 的对象 而且有三个属性 name
  • Android adb实现原理

    adb定义 adb Android Debug Bridge 安卓调试桥 包含adb client adb server和adbd三部分 adb client 运行在PC上 即DDMS或者在Windows dos下启动的adb shell
  • Mysql Connector/J 源码分析(Failover)

    文章目录 前言 一 什么是Failover 二 Failover的主要结构 三 异常处理 3 1 构造连接阶段 小结 3 2 使用连接阶段 小结 四 四元素判定 小结 五 专有选择项 六 官网的态度 总结 前言 本文讨论Connector
  • restful接口客户端和服务端开发,HttpURLConnection,HttpClient,post ,get方式调用

    Restful服务端及客户端调用实例 1 新建web工程作为服务端 创建服务端代码 前情提示 GET SELECT 从服务器取出资源 一项或多项 POST CREATE 在服务器新建一个资源 PUT UPDATE 在服务器更新资源 客户端提
  • Parti 水记

    Parti 水记 Scaling Autoregressive Models for Content Rich Text to Image Generation 主页 https parti research google 论文 https
  • 【图像处理】【图像去模糊】 总结

    本人最近由于做相关去卷积工作 查阅了上百篇文献 发现在这个领域 可能也是 水太深 了 并没有一篇较好的综述 现在做以下总结 只对高斯与散焦模糊的非盲去卷积领域 对于运动模糊并未做总结 但实际上除了点扩散函数的估计有区别 实际上这三类去模糊甚
  • Dart基础语法2

    类 mixin 被mixin 混入 的类不能有构造函数 class A void a print A 的a方法 class B void b print b方法 void a print B 的a方法 满足了我们的多继承的需求 class
  • 运维架构

    首先 后端程序及客户端都是分成三个版本 内部测试版 线上测试版 线上稳定版 线上测试版是小范围更新 经过一天测试没问题 然后再推到线上稳定版 更新其他服 一般游戏也都是按这个流程来更新的 运维管理后台 记录了区服信息 提供各种简单API接口
  • Linux脚本和环境变量

    目录 一 可执行脚本 二 脚本程序解释器 三 SHELL语言 四 shell语言的变量 1 环境变量 2 用户环境变量 一 可执行脚本 脚本script 是一种解释执行的程序 linux中有三种常见的脚本 Shell脚本 sh Python
  • 第八章 基于项的图形视图

    对于用户自定义的窗口部件和绘制一个或者几个项来说 使用QPainter是理想的 在绘图中 如果需要处理从几个到几万个项时 而且要求用户能够单击拖动选取想 Qt的视图类提供了这一解决方案 Qt的视图体系包括一个由QGraphicsScene充
  • javafx事件总线之EventBus

    JAVAFX EventBus是一个轻量级的事件总线框架 用于在JavaFX应用程序中实现基于事件的通信和解耦 它提供了一种简单的方式 让组件能够订阅和发布事件 从而使得应用程序中的各个组件能够相互通信 而不需要相互依赖 JAVAFX Ev
  • node require报错为936的解决方式之一

    node internal modules cjs loader 936 Error Cannot find module crypto js 1 有一种是 你去检查一下你npm下面的node modules是不是又多了个node modu
  • SQL使用视图的优缺点

    INNER JOIN left Join 联接多个表 关于SQL的执行计划 查看SQL语句的具体执行过程 工作原理 SQL使用视图的优缺点 2010 06 04 10 56 43 分类 SQL 标签 字号大中小 订阅 在做数据库开发中使用视
  • 【华为OD机试题】最低位排序 Java代码实现

    题目描述 给定一个非空数组 列表 起元素数据类型为整型 请按照数组元素十进制最低位从小到大进行排序 十进制最低位相同的元素 相对位置保持不变 当数组元素为负值时 十进制最低为等同于去除符号位后对应十进制值最低位 输入 给定一个非空数组 列表
  • (二十三)槽函数的书写规则导致槽函数触发2次的问题

    在创建QT的信号和槽时 经常无意间保留着QT书写槽函数的习惯 或者在QT设计界面直接右键 转到槽 去创建槽函数 但是后期需要用到disconnect时 又重新写了一遍connect函数 那么你会发现实际槽函数执行了2遍 首先来看下这种QT的