07黑马QT笔记之信号重载时connect的写法(带参数的信号)

2023-11-11

07黑马QT笔记之信号重载时connect的写法(带参数的信号)

1 首先说这个例子要做的事情。一个窗口有两个按钮,分别为按钮1、按钮2。当我按下按钮2时,他会发射两个信号,这两个信号重载,名字一样。所以当我接收这两个信号并处理时,connect该如何去写呢?

2 下面先重点列出重要的代码:
1)错误的写法:

    connect(this,&MyWidget::mySignal,this,&MyWidget::dealMySignal1); //处理无参
    connect(this,&MyWidget::mySignal,this,&MyWidget::dealMySignal2); //处理有参
    //上面这样写出错 因为mySignal是重载信号 编译器无法识别是有参还是无参的  需要使用函数指针区别(槽函数重载时同理)

可以看出,信号名字一样,编译器无法识别出是哪个信号函数,下面给出正确写法。一个是Qt5版本(利用函数指针),一个是Qt4版本(利用信号和槽的两个宏)。

2)Qt5版本的写法:

    //函数指针区别信号重载 ---右边注释是书写时的注意事项
    //出现信号重载 Qt5的connect写法:
    void (MyWidget::*myS1)()=&MyWidget::mySignal;               //注意等号后面只需加函数名 不要加括号
    void (MyWidget::*myS2)(int,QString)=&MyWidget::mySignal;    //与普通函数指针区别是在等号前加“MyWidget::”后面加作用域“&MyWidget::”
    connect(this,myS1,this,&MyWidget::dealMySignal1);           //处理无参 //myS1的位置不需要再加作用域
    connect(this,myS2,this,&MyWidget::dealMySignal2);           //处理有参
    

3)Qt4版本的写法:

    /*当出现重载信号 Qt4的connect写法(上面是Qt5写法):
    1)槽函数必须带有solts关键字 且要带有访问权限(公有保护私有)
    2)使用SIGNAL和SLOT两个宏来书写信号和槽
    2)编译时他不会进行错误检查   只是将函数名字当成字符串
    */
    connect(this,SIGNAL(mySignal()),this,SLOT(dealMySignal1()));
    connect(this,SIGNAL(mySignal(int,QString)),this,SLOT(dealMySignal2(int,QString)));

3 完整的代码:
1)项目文件:(没修改过)

#-------------------------------------------------
#
# Project created by QtCreator 2020-04-22T16:28:55
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = 01_ManyParameter
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += main.cpp\
        mywidget.cpp

HEADERS  += mywidget.h

2)头文件:

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include<QPushButton>

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    MyWidget(QWidget *parent = 0);
    ~MyWidget();

public slots:                                 //Qt4必须写slots关键字
    void dealButton2();                       //处理按钮2的槽函数
    void dealMySignal1();                     //处理无参的槽函数
    void dealMySignal2(int,QString);          //处理有参的槽函数

private:
    QPushButton b1,b2;
signals:
    void mySignal();
    void mySignal(int,QString);               //带参数的信号 且信号可以重载
};

#endif // MYWIDGET_H

3).cpp文件:

#include "mywidget.h"
#include<QDebug>

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    b1.setParent(this);
    b2.setParent(this);
    b1.setText("按钮1");
    b2.setText("按钮2");
    b2.move(50,50);

    connect(&b2,&QPushButton::clicked,this,&MyWidget::dealButton2);  //按下按钮2 发射两个重载的信号
    
    /*
    connect(this,&MyWidget::mySignal,this,&MyWidget::dealMySignal1); //处理无参
    connect(this,&MyWidget::mySignal,this,&MyWidget::dealMySignal2); //处理有参
    上面这样写出错 因为mySignal是重载信号 编译器无法识别是有参还是无参的  需要使用函数指针区别(槽函数重载时同理)
    */

    //函数指针区别信号重载 ---右边注释是书写时的注意事项
    /* 出现信号重载 Qt5的connect写法:
    void (MyWidget::*myS1)()=&MyWidget::mySignal;               //注意等号后面只需加函数名 不要加括号
    void (MyWidget::*myS2)(int,QString)=&MyWidget::mySignal;    //与普通函数指针区别是在等号前加“MyWidget::”后面加作用域“&MyWidget::”
    connect(this,myS1,this,&MyWidget::dealMySignal1);           //处理无参 //myS1的位置不需要再加作用域
    connect(this,myS2,this,&MyWidget::dealMySignal2);           //处理有参
    */

    /*当出现重载信号 Qt4的connect写法(上面是Qt5写法):
    1)槽函数必须带有solts关键字 且要带有访问权限(公有保护私有)
    2)使用SIGNAL和SLOT两个宏来书写信号和槽
    2)编译时他不会进行错误检查   只是将函数名字当成字符串
    */
    connect(this,SIGNAL(mySignal()),this,SLOT(dealMySignal1()));
    connect(this,SIGNAL(mySignal(int,QString)),this,SLOT(dealMySignal2(int,QString)));

}

//处理按钮2的槽函数
void MyWidget::dealButton2()
{
    emit mySignal();
    emit mySignal(50,"我是按钮2");             //这里写实参 不是形参
}

//处理无参信号槽函数
void MyWidget::dealMySignal1()
{
    qDebug()<<"我是无参数的信号";
}

//处理有参信号槽函数
void MyWidget::dealMySignal2(int val,QString str)
{
    //显示中文需要是char*类型。  str.toUtf8()从QString转为QByteArray字节数组。 data()转为char*
    qDebug()<<val<<str.toUtf8().data();
}

MyWidget::~MyWidget()
{

}

4)主函数:(没修改过)

#include "mywidget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyWidget w;
    w.show();

    return a.exec();
}

总结重载信号时的connect写法:看前两点就可以。不难。最主要掌握Qt5的写法,他是最常用也安全。

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

07黑马QT笔记之信号重载时connect的写法(带参数的信号) 的相关文章

  • 程序意外完成 - QT Creator

    我正在尝试使用 QT Creator 使用 QT 框架开发 GUI 控制台应用程序 我使用的是Windows XP 我安装了QT 4 8 3和mingw 两者均已安装 没有任何错误 然后我安装了QT Creator QT 版本 路径中的 Q
  • Qt - 如何粘合两个窗口并将它们移动在一起?

    就像qmmp Qt 音乐播放器ui设计一样 这两个或三个窗口实际上在同一个窗口中 因为只有一个dock图标 并且这些窗口可以一起移动并相互附着 我看了源码 好像有用QDockWidget 但我真的不知道如何获得它的细节 当您手动移动辅助窗口
  • 如何在带有预编译头的项目中使用google protobuf

    我有一个包含多个项目的解决方案 我的项目 但不是全部 使用预编译头 我决定使用 protobuf 但遇到了一个问题 在 protoc exe 从 proto 生成 pb h 后 我尝试包含标头并收到错误 预编译标头未包含在 pb h 中 我
  • 错误 LNK2001:无法解析的外部符号 __CxxFrameHandler3

    我正在将 Qt 从 VS 2013 迁移到 Qt 5 10 1 到 VS 2015 出现以下多个链接错误 error LNK2001 unresolved external symbol CxxFrameHandler3 error LNK
  • 在 Qt5 中,是否需要 Q_INVOKABLE 来从 QML 调用公共 QObject 函数?

    我刚刚意识到我可以调用暴露于 QML 的对象的几乎任何函数 现在我对 Q INVOKABLE 很好奇 Qt5docs http doc qt io qt 5 qtqml cppintegration exposecppattributes
  • QCombobox 向下箭头图像

    如何更改Qcombobox向下箭头图像 现在我正在使用这个 QSS 代码 但这不起作用 我无法删除向下箭头边框 QComboBox border 0px QComboBox down arrow border 0px background
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • PyQt5:如何使QThread返回数据到主线程

    I am a PyQt 5 4 1 1初学者 我的Python是3 4 3 这是我尝试遵循的many https mayaposch wordpress com 2011 11 01 how to really truly use qthr
  • Qt 插槽是否与其他代码并行运行?

    在此函数示例中 void MyClass myFunction emit MySignal1 emit MySignal2 如果我有slot1倾听MySignal1 and slot2倾听MySignal2 1 Is slot1总是会在之前
  • 将 gnuplot 嵌入现有 QtWidget 中

    我正在用 C 创建一个 伪 实时绘图应用程序 使用 gnuplot 作为绘图后端 我的要求之一是绘图必须位于现有窗口内 而不是有一个单独的绘图窗口 gnuplot 默认为 Gnuplot 有一个选项可以指定 Qt 小部件 ID 这似乎适合我
  • Qt:在多个布局中使用一个小部件

    我有一个 QTabBar 所有选项卡都应该有相同的小部件 layout1 gt addWidget w layout2 gt addWidget w 然而打电话addWidget第二次导致该小部件在第一个布局中消失 有没有办法使用一个小部件
  • 如何检测QTableView中的双击

    我正在使用 PyQt 创建 GUI 应用程序 在继承自 QTableView 的视图中 需要检测用户双击行时选择的行 该表可以排序 但不能编辑 我该怎么做 注意 尝试了 doubleClicked int 信号 它是由鼠标按钮发出的 而不是
  • 从 Qt4 中的文本文件中逐字读取

    我想在 Qt4 中逐字读取一个文本文件 说实话我对它很陌生 我想在另一个文件中每行一个字写入 我可以在 C 中做到这一点 没有任何问题 但是当我尝试在 Qt4 中使用 ifstream 和 ofstream 时 我遇到了错误 这是我的 Qt
  • 在高 dpi Windows 平台上自动重新缩放应用程序?

    我正在编写一个需要在高 dpi Windows 192dpi 而不是 96dpi 上运行的 Qt 应用程序 不幸的是 Qt 框架尚不支持高 dpi 至少在 Windows 上 因此我的应用程序及其所有元素看起来只有应有尺寸的一半 有没有办法
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 如何将 zlib 添加到现有的 qt 安装中

    如何将 zlib 添加到 Qt 的现有安装中 我对此很陌生 所以请给我详细的描述 提前感谢您的帮助 zlib 包含在 Qt 核心库中 如果你想在 Qt 程序中使用 zlib 函数 你只需要包含 src 3rdparty zlib 中的 zl
  • Mac 上的 Qt — 如何访问帮助菜单中的“搜索”

    我正在将我的 Qt 应用程序移植到 Mac OS X 在 Windows Linux 上 我使用 QLineEdit 在帮助菜单中提供搜索功能 In Mac OS X I saw something like this is built i
  • 安装J语言的JQt IDE,出现错误

    我一直按照这里的说明进行操作 http code jsoftware com wiki System Installation Linux http code jsoftware com wiki System Installation L
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • Qt 安装程序框架 - 如何在卸载时仅删除某些文件和文件夹

    我使用 Qt 安装程序框架 如何确保在卸载时仅删除某些文件或文件夹 而不是像当前那样删除安装文件夹中的所有文件 先感谢您 您可以覆盖默认行为component createOperations对于卸载程序 然后使用手动指定每个卸载路径com

随机推荐

  • 【C语言】数据结构-----字符串匹配之KMP算法

    目录 算法简介 匹配原理 第一次匹配 第二次匹配 第三次匹配 第四次匹配 可能失配位置 next数组求解 next数组的由来 next数组的用法 next数组代码的实现 KMP算法的实现 示例 完整的代码 KMP算法与BF算法相比较 算法简
  • python处理ECG二进制文件(.dat文件)和.db文件

    python处理ECG二进制文件 dat文件 和 db文件 最近拿到了一批ECG原数据文件 包括 dat和 db文件 需要自己解析 记录一下解析结果 1 dat 文件是病人的心电数据 以二进制形式读取和解析 数据文件的说明 数据文件记录的是
  • FLASH擦除问题

    我们最近用mm32f3277的flash mm32f3277的flash有512K的空间 128个扇区 每个扇区有四页 每页有1K 图一 mm32f3277的flash 我们写入flash用的是片内FLASH存储器 片内FLASH存储器的地
  • java多线程异步处理批量数据

    前段时间需要一个批量请求别人接口的模块 由于别人接口反应速度慢导致批量请求耗费时间太多 于是在网上多发查询找到一个批量异步接口切能返回数据 多线程配置类 import org springframework aop interceptor
  • error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

    一 问题描述 打开用VS2010打开vs 2008创建的解决方案 重新生成解决方案时 报如下错误 error LNK1123 转换到 COFF 期间失败 文件无效或损坏 二 原因分析 输入文件必须具有通用对象文件格式 COFF 如果输入文件
  • Maven 子项目

    使用maven搭建的子项目 其中包含web子项目和其他依赖子项目 在使用tomcat构建war的时候 会构建该web相对应的war maven关联的其他子项目会以jar包的形式关联到lib中 从而 使得web项目中可以引用其他包的类以及配置
  • 【C++】友元

    目录 友元的定义 全局函数做友元 类做友元 成员函数做友元 友元的定义 友元定义在类外面的一种函数或者类 友元不是成员函数 但是友元可以对某个类里面私有成员进行访问 要想友元获得访问某个类私有成员的权限 我们需要利用关键字friend并且在
  • eclipse web 项目中配置jetty-maven-plugin 版本 9.4.2.v20170220

    在web项目的pom xml文件中添加jetty maven plugin插件配置 如下
  • 【图像处理】去雾算法

    真正了解了什么叫最简单的就是最美好的 真正的好文章不需要大堆公式堆积显得充实 而是最最平实的思想 这篇文章的 原文PDF PPT 感兴趣的可以了解一下 这篇文章的目的就是以最简单的思路将图像达到去雾效果 用Matlab编了一下 效果图特别好
  • Windows11 安装 chocolatey 包管理器

    众所周知每个Linux发行版都有一个包管理器 比如Ubuntu的 apt get Centos的 yum Arch Linux的 pacman 那么问题来了 Windows有包管理器吗 Windows 目前最新版的系统有一个 winget
  • LLVM每日谈之十九 LLVM的第一本系统的书<Getting Started with LLVM Core Libraries>

    作者 史宁宁 snsn1984 LLVM最终有了一本系统的书了 Getting Started with LLVM Core Libraries 这本书号称是LLVM的第一本书 可是据说日本早就有两本日文的关于LLVM的书 这个了解的不多
  • 数据库学习笔记(4)——SQL语言之DQL

    复杂分组查询举例 子查询 把select查询结果当作数据使用时 这种结构就是子查询 子查询练习 子查询练习 查询学生成绩在70分以上的学生学号和姓名 select stu id as id stu name as 姓名 from tb st
  • 傻白探索Chiplet,关于EPYC Zen2 的一些理解记录(五)

    目录 一 知识铺垫 1 Chiplet 2 Zen架构 3 EPYC和Ryzen 4 EPYC Zen2 二 关于EPYC Zen2里的部件 1 内存控制器 2 PCIe控制器 3 Infinity Fabric总线 4 关于CCX和CCD
  • 深度学习之人物年龄预测

    1 年龄检测 论文地址 Age and Gender Classification using Convolutional Neural Networks 论文作者提出了一个简单的类似AlexNet的网络结构 该网络总共学习了8个年龄段 0
  • CentOS中DHCP服务器的搭建

    1 进入网卡配置文件 将网卡的网络修改为静态配置 2 yum y insytall dhcp 3 vi etc dhcp dhcpd conf 4 vi usr share doc dhcp dhcpd conf example 5 cp
  • 支付宝小程序 生成https链接 生成alipays协议链接

    生成https协议链接 const target 返回的页面地址 const online https render alipay com p s medical card online www index html returnUrl e
  • c语言课程设计(学生籍贯管理系统)学完c语言你可以做的案例

    目录 第一章 设计简介及设计方案讨论 1 1背景和意义 1 1 1背景 1 1 2意义 1 2需求分析 1 3使用说明 1 4流程图 1 5设计 1 5 1功能实现 第二章 核心代码讲解 2 1核心代码与分析 2 1 1代码和分析 第三章
  • tensorflow ResNet

    借鉴点 层间残差跳连 引入前方信息 减少梯度消失 使神经网络层数变身成为可能 ResNet 即深度残差网络 由何恺明及其团队提出 是深度学习领域又一具有开创性的 工作 通过对残差结构的运用 ResNet 使得训练数百层的网络成为了可能 从而
  • ROS理论与实践学习汇总(持续更新中······)

    创建工作空间 创建工作空间 mkdir p catkin ws src cd catkin ws src catkin init workspace 初始化 编译工作空间 cd catkin ws catkin make 设置环境变量 so
  • 07黑马QT笔记之信号重载时connect的写法(带参数的信号)

    07黑马QT笔记之信号重载时connect的写法 带参数的信号 1 首先说这个例子要做的事情 一个窗口有两个按钮 分别为按钮1 按钮2 当我按下按钮2时 他会发射两个信号 这两个信号重载 名字一样 所以当我接收这两个信号并处理时 conne