首页 > 其他分享 >信号和槽介绍、使用方式

信号和槽介绍、使用方式

时间:2024-09-11 23:20:38浏览次数:12  
标签:SLOT 函数 方式 SIGNAL 介绍 ui connect 信号

一、信号与槽的 简介

        信号与槽是Qt的编程基础,是Qt编程的核心特性,也是Qt区别与其它C++开发框架的重要特性。

        信号:是在特定情况下被发射的通知,例如QPushButton较常见的信号就是点击时发射的clicked()信号。GUI程序设计的主要工作就是对界面上各组件的信号进行响应,只需要知道什么时候发射哪些信号,合理的去响应和处理这些信号就可以了。
        槽(slot)是对信号进行响应的函数。槽就是函数,所以也称为槽函数。槽函数与一般的C++函数一样,可以具有任何参数,也可以被直接调用。槽函数与一般的函数不同的是:槽函数可以与信号关联,当信号被发射时,关联的槽函数被自动运行。

        信号与槽关联是用函数 QObject::connect()实现的,使用函数 connect()的基本格式如下QObject::connect(sender, SIGNAL(signal()),receiver, SLOT(slot()));

connect()是 QObject 类的一个静态函数,而 QObject是大部分 Qt类的基类,在实际调用时可以忽略前面的限定符部分,所以可以直接写为:
connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));

其中,sender是发射信号的对象的名称:signal0是信号,信号可以看作特殊的函数,需要带有括号,有参数时还需要指明各参数类型;receiver 是接收信号的对象的名称;slotO是槽函数,需要带有括号,有参数时还需要指明各参数类型。
        SIGNAL和SLOT 是 Qt的宏,分别用于指明信号和槽函数,并将它们的参数转换为相应符串。关于信号与槽的使用,有以下一些规则需要注意。

  •         一个信号可以连接多个槽函数,例如:

        connect(spinNum,SIGNAL(valueChanged(int)), this, SLOT (addFun (int)));

        connect(spinNum, SIGNAL (valuechanged(int)), this, SLOT (updateStatus (int)));
        当一个信号与多个槽函数关联时,槽函数按照建立连接时的顺序依次运行。

        当信号和槽函数带有参数时,在函数connect()里要指明各参数的类型。但不用指明参数名称

  • 多个信号可以连接同一个槽函数。例如在本示例中,3个选择颜色的单选按钮的clicked()信号关联到相同的自定义槽函数 do_setFontColor()。

        connect(ui->radioBlack,SIGNAL(clicked()),this,SLOT(do_setFontColor()));

        connect(ui->radioRed,SIGNAL(clicked()),this,SLOT(do_setFontColor()));

        connect(ui->radioBlue,SIGNAL(clicked()),this,SLOT(do_setFontColor()));

  • 一个信号可以连接另一个信号,例如:

        connect(spinNum, SIGNAL (valuechanged(int)), this, SLOT (refreshInfo (int)));

        这样发射一个信号时,也会发射另一个信号,以实现某种特殊的功能。

  • 严格下,信号与槽的参数个数需要与类型一致,至少信号的参数不能少于槽的参数。如果参数不匹配,会出现编译错误或运行错误。

  • 在使用信号与槽的类中,必须在类的定义中插入宏Q_OBJECT

  • 当一个信号被发射时,与关联的槽函数通常被立即运行,就像正常调用函数一样,只有当信号关联的所有槽函数运行完毕后,才运行发射信号处后面的代码。

        槽函数connect()有多种参数形式,有一种常用的形式是不用SIGNAL和SLOT宏,而是使用函数指针。在下边文章回详细介绍几种参数形式和使用方法。

二、信号与槽的使用

1、信号与槽的编辑器的使用

        Qt的界面组件都是从 QWidget继承而来的,都支持信号与槽的功能。每个类都有一些内建的信号和槽函数,例如 QPushButton类的常用信号是clicked(),在按钮被点击时此信号被发射。QDialog 是对话框类,它有以下几个公有的槽函数。

  • accept(),功能是关闭对话框,表示肯定的选择,如对话框上的“确定”按钮。

  • reject(),功能是关闭对话框,表示否定的选择,如对话框上的“取消”按钮。

  • eclose(),功能是关闭对话框。

        这3个槽函数都可以关闭对话框,但是表示的对话框的返回值不同,。在本示例中,我们希望将“确定”按钮与对话框的 acceptO槽函数关联,将“退出”按钮与对话框的 closeO槽函数关联。可以在 Action 编辑器里设置组件的内建信号与其他组件的公有槽函数关联。

2、使用自定义槽函数

        设置文字颜色的3个单选按钮是互斥选择的,即一次只有一个单选按钮被选中,虽然也可以采用 Go to slot 对话框为它们的 clicked()信号生成槽函数,但是这样就需要生成3个槽函数。我们换一种方式,即设计一个自定义槽函数,将3个单选按钮的clickedO信号都与这个自定义槽函数关联。为此,在 Dialog 类的 private slots 部分增加如下的槽函数定义。

void do_setFontColor();

        将鼠标光标移动到这个函数名上面,点击鼠标右键,在弹出的快捷菜单中选择 Refactor→AddDefinition in dialog.cpp,就可以在文件 dialog.cpp 中自动生成该函数的代码框架。为该函数编写代码,具体如下。
 

void Dialog::do setFontColor()
{//自定义槽函数,设置文字颜色
    QPalette plet=ui->plainTextEdit->palette(),
    if(ui->radioBlue->isChecked())
        plet.setColor(QPalette::Text,Qt::blue);
    else if(ui->radioRed->isChecked())
        plet.setColor(QPalette::Text,Qt::red);
    else if(ui->radioBlack->isChecked())
        plet.setColor(QPalette::Text,Qt::black);
    else
        plet,setColor(QPalette::Text,Qt::black);
    ui->plainTextEdit->setPalette(plet);
}

        由于这个槽函数是自定义的,因此它不会与界面上3个单选按钮的clickedO信号自动关联我们需要在 Dialog 类的构造函数中手动进行关联,代码如下:

Dialog::Dialog(QWidget *parent):Qpialog(parent),ui(new Ui::Dialog)
{
    ui->setupUi(this);
    connect (ui->radioBlack,SIGNAL(clicked()),this,SLOT(do_setFontColor ()));
    connect (ui->radioRed,SIGNAL(clicked()),this,SLOT(do_setFontColor ()));
    connect (ui->radioBlue,SIGNAL(clicked()),this,SLOT(do_setFontColor ()));
}

构建项目之后运行,点击3个单选按钮就可以改变文字的颜色了。

标签:SLOT,函数,方式,SIGNAL,介绍,ui,connect,信号
From: https://blog.csdn.net/m0_69416620/article/details/142040852

相关文章

  • IP传递方式的综述
    IP的传递方式单播(Unicast):单播是主机间一对一的通讯模式。网络中的设备根据网络报文中包含的目的地址选择传输路径,将单播报文传送到指定的目的地,只对接收到的数据进行转发,不会进行复制。采用单播方式时,系统为每个需求该数据的用户单独建立一条数据传输通路,并为该用户发送一份......
  • 基于FPGA与RK3588的多通道低延时3G-SDI视频信号
    目录简介主要用途:项目简介:详细过程:BT1120视频时序转CEA861视频像素编码格式转换低延时处理MIPI接口处理视频处理模块​​​​​​​简介主要解决 RK3588支持多种视频格式输入,但是没有支持多路SDI接口的设计方案,系统利用实现四路SDI视频图像的采集。传输。处理,以......
  • ALIENTEK电容按键按键的介绍与驱动代码
    目录前言电容触摸按键原理 硬件接线检测电容触摸按键过程驱动代码 tpad.htpad.cmain.c 前言我没有独立的电容触摸按键模块,所以使用正点原子STM32F103ZET6精英版开发板上的电容触摸按键。采用STM32F103C8T6检测电容触摸按键,代码为正点原子精英版开发板移植。电......
  • 爬虫案例2-爬取视频的三种方式之一:selenium篇(2)
    @目录前言selenium简介实战案例共勉博客前言继使用requests库爬取好看视频的文章后,本文分享使用python第三方库selenium库接着来爬取视频网站,后续也会接着分享使用第三方库DrissionPage爬取视频。selenium简介selenium是一个用于web应用测试的工具集,它可以直接运行在浏览器中,......
  • ThreadLocal 释放的方式有哪些
    ThreadLocal基础概念:IT-BLOG-CNThreadLocal是Java中用于在同一个线程中存储和隔离变量的一种机制。通常情况下,我们使用ThreadLocal来存储线程独有的变量,并在任务完成后通过remove方法清理这些变量,以防止内存泄漏。然而,在使用线程池时,线程会被重用,这可能导致ThreadLocal变量......
  • css常用方式
     常容器用的样式:position:relative|absolute;/*相对定位|决定定位*/display:flex;/*浮动*/line-height:0px;/*div撑开问题*/对 rpx 详细说明:设计师在提供设计图时,一般只提供一个分辨率的图。严格按设计图标注的px做开发,在不同宽度的手机上界面很容易变......
  • --优质Java基础练习-- 采取控制台方式书写简单学生管理系统【升级版本(含注册登录功能)
    目录前言     该项目涉及的知识点项目准备 JDK编程工具Idea 需求文档-升级部分(参考黑马程序员)学生管理系统升级版需求分析登录界面用户类注册功能登录功能忘记密码验证码规则需求分析 编码新建项目-StudentManagementStudent类User类 核心方......
  • 嵌套集合模型(Nested set model)介绍
    嵌套集合模型(Nestedsetmodel)介绍pilishen /更新于5年前本文翻译自维基百科Nestedsetmodel 此文档是 nestedset-无限分类正确姿势的扩展阅读 nestedsetmodel(嵌套集合模型)是一种在关系型数据库中表示nestedsets(嵌套集合) 的特殊技术。[nestedsets]通常......
  • 【PHP编程】PHP闭包函数及函数回调的实现方式
    https://mp.weixin.qq.com/s/ji6hofCun7w7ErRvLuAiuA原创PHP星编程经验共享2023年10月19日08:01广东1.匿名函数在了解回调函数之前我们来了解一下什么是匿名函数?顾名思义,匿名函数就是一个没有确定函数名的函数,PHP将匿名函数和闭包视作相同的概念,所以匿名函数在PHP中......
  • JMeter 介绍与安装
    简介ApacheJMeter是一个开源的Java应用程序,用于进行性能测试和负载测试。它可以模拟多种协议的负载,被广泛用于测试Web应用程序、Web服务、数据库和其他网络服务的性能。JMeter的优点纯Java程序,跨平台性强:Windows、Mac、Linux开源免费。高可扩展性:支持插件和扩展......