Qt学习之信号和槽

QT的信号槽的四种写法和五种链接方式 在Qt中,信号(Signal)和槽(Slot)是一种用于对象之间通信的机制,用于实现一种松耦合的方式。信号被发送时,与之相关联的槽会被调用。 阅读详情

基本概念

        信号与槽(Signal & Slot)是 Qt 编程的基础,也是 Qt 的一大创新。因为有了信号与槽的编程机制,在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单。

        信号(Signal)就是在特定情况下被发射的事件,例如PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号,一个 ComboBox 最常见的信号是选择的列表项变化时发射的 CurrentIndexChanged() 信号。

        槽(Slot)就是对信号响应的函数。槽就是一个函数,与一般的C++函数是一样的,可以定义在类的任何部分(public、private 或 protected),可以具有任何参数,也可以被直接调用。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。

        信号与槽关联是用 QObject::connect() 函数实现的,其基本格式是:

QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

信号连接槽主要的特性:

        1:一个信号可以对应多个槽;多个信号可以对应一个槽。
        2:一个信号可以连接另一个信号。
        3:信号与槽的参数个数和类型需要一致,至少信号的参数不能少于槽的参数。
        4:当一个信号被发射时,与其关联的槽函数通常被立即执行,就像正常调用一个函数一样。只有当信号关联的所有槽函数执行完毕后,才会执行发射信号处后面的代码。

代码案例

        假设有这样一个场景:
                有两个类:妈妈类和儿子类;
                妈妈类中有1个信号:做饭时间;有一个动作:回家做饭。
                儿子类中有1个信号:放学回家;有一个动作:打扫教室。

        案例代码如下:

#include <QObject>
#include <QDebug>

// 妈妈类
class mom: public QObject
{
    Q_OBJECT
public:
    explicit mom(QObject *parent = nullptr);

signals:
    void cookTime();    // 中午做饭时间到了

public slots:
    void cook(){ qDebug() << "---回家做饭---" ;}
};

// 儿子类
class son: public QObject
{
    Q_OBJECT
public:
    explicit son(QObject *parent = nullptr);

signals:
    void goHome();    // 放学时间到了

public slots:
    void cloosDoor(){ qDebug() << "---打扫教室卫生---" ; }
};

……
mom *pMom = new mom();
son *pSon = new son();

// 一个信号可以对应两个槽
    // 儿子放学信号后妈妈回家做饭
    connect(pSon , &son::goHome, pMom, &mom::cook);

    // 儿子放学信号后打扫教室卫生 
    connect(pSon , &son::goHome, pSon , &son::cloosDoor);

// 信号可以连接信号
    // 中午做饭时间到了,妈妈回家做饭
    connect(pMom, &mom::cookTime, pMom, &mom::cook);
    // 儿子放学的信号连接妈妈类中的中午做饭时间信号
    connect(pSon , &son::goHome, pMom, &mom::cookTime);
……

        Qt中的槽函数实现在新版本的C++11里可以借助Lambda表达式,Lambda表达式简单格式为:[ ]( ){ }。[ ]:表示符,( ):参数,{ }:实现体;运用Lambda表达式可以使得槽函数的实现更加丰富多样性。

QT学习(1)——创建第一个QT程序,信号和槽,打开关闭窗口的案例 阅读详情

相关推荐

Qt学习第三课:信号与槽扩展

Qt学习第三课:信号与槽扩展 Qt信号量和槽不止上一节的内容,还有拓展部分。 1.信号与槽函数可以传参数 现在写出重载的信号和槽定义, 信号不用实现,槽函数必须实现。 信号和槽函数声明和实现之后,就去窗口类对象调用 此时,要想使用有参或无参的信号和槽,需要使用函数指针赋值,格式如下: 函数指针 -> 函数地址 void(*p)(QString) = &am...

DuanYi1998的博客 394

Qt信号与槽(四种写法)

学习记录:分析Qt信号与槽的四种不同方式。

丢掉幻想,准备斗争 1469

Qt 源代码 - 05 信号和槽(一)

Qt 05 信号和槽 源代码

Qt信号槽的四种写法

概述 这四种写法在最新版本的Qt中都可用,有比较简单的写法,也有比较复杂的写法,为了理解其中的差异,不妨先定义个控件: class Button : public QWidget { Q_OBJECT public: explicit MyButton(QWidget *parent = nullptr); signals: void sigClicked(); void sigClicked(bool check); }; class Widget : public ...

qq_28742901的博客 6576

USB之ch376s数据手册

         最近师兄交给我一个项目,虽说刚学嵌入式起步,但上手一个项目怎说都是最好的快速学习方式。因为刚了解ch376s管理U盘的数据,所以先是看了ch376s的数据手册。那我就把数据手册直接放上来吧。。。。      1、概述 CH376 是文件管理控制芯片,用于单片机系统读写 U 盘或者 SD 卡中的文件。 CH376 支持 USB 设备方式和 USB 主机方式,并且内置了 USB 通...

iBGG的博客 6002

基于AT32F421的紧凑型FOC电机驱动板设计

磁场定向控制(FOC)是永磁同步电机(PMSM)与无刷直流电机(BLDC)实现高精度转矩控制和高效运行的核心技术,其本质是通过Clarke/Park坐标变换解耦定子电流,实现d轴磁链与q轴转矩的独立调节。该技术依赖实时性严苛的电流采样、高精度位置反馈及确定性PWM生成,广泛应用于机器人关节、智能装备等中小功率伺服场景。国产Cortex-M4微控制器(如AT32F421)凭借集成ADC、高级定时器与DSP指令集,已成为低成本、高可靠FOC嵌入式实现的理想平台。本文围绕一款工程化FOC驱动板展开,涵盖低侧电流采

weixin_42510243的博客 700

【六】【QT开发应用】信号和信号槽的五种写法

mainwindow.cpp 复盘 第一种写法 旧的信号和槽机制在 Qt 4 及更早版本中,信号和槽的连接使用的是字符串形式的信号和槽。这种方式通过 SIGNAL 和 SLOT 宏将信号和槽的签名转换为字符串。 在本文中的例子: 信号 (SIGNAL): SIGNAL(clicked()):这里的 clicked() 是 QPushButton 类的一个信号。当按钮被点击时,这个信号会被发射。 SIGNAL 宏将 clicked() 转换为字符串 “2clicked()”。这里的 2 是内部使用的一个标记

m0_74163972的博客 1330

告别第三方插件:官方Fused Library如何重塑Android库的合并与发布流程

本文详细介绍了Android官方推出的Fused Library如何替代第三方fat-aar插件,优化Android库的合并与发布流程。通过原生支持、智能依赖管理等优势,Fused Library解决了版本兼容性、依赖传递等核心痛点,提供了更稳定高效的开发体验。文章还提供了迁移实操指南和工程实践建议,帮助开发者顺利过渡到官方方案。

weixin_42561040的博客 252

Qt信号槽的两种写法

Qt信号槽connect是什么? connect()函数的形式 connect(sender, signal, receiver, slot,type); 参数示意 sender:发出信号的对象 signal:发送对象发出的信号 receiver:要接收信号的对象 slot:接收对象收到信号后调用的函数 type:连接方式,默认自动auto,可设置成同步Driect或异步Quence等方式,可参考品前文 传统Qt4写法(极度不推荐) connect(btn_close, SIGNAL(cli

索命的博客 1585

戴尔PowerEdge服务器R450 RAID配置步骤

戴尔PowerEdge服务器R450 RAID配置步骤

且听风呤tmj的博客 6910

MIA文献阅读 —— 深度学习在医学图像分析中的最新进展及临床应用【2024】_再现性;深度学习

coderVAEVAEVAE) (Kingma威林,2014)在概率性的工作方式学习观测数据之间的映射空间x∈Rmx∈R^mx∈Rm 和潜在的空间z∈Rnmnz∈Rn(m>>n)。作为一个潜变量模型,VAEVAEVAE制定这个问题作为观察样品的最大化对数似logpxlog∫px∣zpzdzpx∣zp (x | z)p(x∣z)可以很容易地使用神经网络建模,和pzp (z)

2401_84181704的博客 1242

Qt学习笔记(二)Qt 信号与槽

在学习 Qt 的过程中,信号与槽是必不可少的部分,也是 Qt 编程的基础,是 Qt 编程的一大创新,这里分一个章节来学习这个 Qt 的信号与槽。信号(Signal)就是在特定情况下被发射的事件,例如 PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号,一个 ComboBox 最常见的信号是选择的列表项变化时发射的CurrentIndexChanged() 信号。

sincerelover的博客 1563

SAP_ABAP_MM_BAPI清单案例教程——采购发票校验/预制_BAPI_INCOMINGINVOICE_PARK_MIRO

SAP ABAP BAPI_INCOMINGINVOICE_PARK BAPI 采购发票预制 采购发票校验 代码模版

java_zhong1990的专栏 1961

Qt学习及使用_第3部分_Qt框架功能概述---信号与槽

学以致用,通过QT框架的学习,一边实践,一边探索编程的方方面面参考书:<Qt 6 C++开发指南>(以下称"本书"),继承关系沿用本书说法:父类/子类,而非传统C++使用基类/派生类概念用粗体+倾斜.重点内容用(加粗黑体)---重点内容(红字)---重点内容(加粗红字),本书原话内容用深蓝色标识,比较重要的内容用加粗倾斜下划线深蓝色标识信号与槽是Qt编程的基础,也是Qt的一大创新.有了信号与槽的编程机制,在Qt中处理界面上各个组件的交互操作就变得比较直观和简单---

jllws1的博客 790

Android Audio音量——音频类型新增(九)

在实际开发中,经常会遇到需要新增一个音频类型(usage)的需求,这里我们简单介绍一下需要修改的代码。

小旭的专栏 1570

YOLOv8模型改进、剪枝、蒸馏和Web端界面的直观展示

模型蒸馏与性能提升 为了进一步优化YOLOv8模型,可以使用蒸馏技术将大型模型的知识转移到小型模型中。在模型蒸馏过程中,通过定义适当的损失函数和训练策略,学生网络可以学习教师网络的知识,并达到接近教师网络性能的效果。这样做不仅可以减少模型的存储和计算开销,还可以提高模型的推理速度和实时应用的响应能力。这样,用户可以直观地观察到模型的性能和应用的效果。为了优化YOLOv8模型并实现直观地观看检测效果或训练结果的全家通应用,本文将探讨如何通过改进、剪枝和蒸馏技术,并结合Web端界面来提升模型性能。

weixin_51988935的博客 2396

Qt学习笔记5(信号与槽)

建立一个信号与槽的新工程,布置与之前的一致。

2401_83229066的博客 498

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

QT学习之信号和槽

,信号也可以跟信号相连(一个触发后会触发另一个)QObject::connect(&a,SIGNAL(signalChangeColor(int)), this, SIGNAL(signalChangeColor(int)));当信号产生,信号会暂时被缓冲到一个消息队列中,不用等待槽函数返回,就会执行后面的代码。按钮的槽函数发射了一个信号,这个信号触发了另一个槽函数,第二个槽函数弹得那个“可以触发!solt:对信号响应的函数,槽函数可以与一个信号关联,当信号被发射,关联的槽函数自动被执行;

qq_23136415的博客 1450

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

QT开发学习手册(三)-如何理解信号和槽

QT开发学习手册(三)-如何理解信号和槽 一、前言 二、过程 1、新建项目工程 然后一直选择默认设置,一直下一步 2、实现简单的信号和槽函数例程 1、头文件实现 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QPushButton> namespace Ui { c...

CH的博客 376

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Qt学习之路_005-自定义的信号和槽

文章目录Qt学习之路_005-自定义的信号和槽 Qt学习之路_005-自定义的信号和槽

CSU_hjh的博客 250

Qt入门学习之——信号和槽

信号连接信号一个信号可以连接多个槽函数多个信号可以连接同一个槽函数信号和槽的参数类型 必须一一对应信号的参数个数可以多于槽函数,反之不可以,相同个数的参数类型也要一一对应(类似于 c++的函数重载)可以利用disconnect断开信号槽的连接。

m0_70289867的博客 152

[Qt的学习日常]--信号和槽

什么是信号和槽,自定义槽函数和信号函数,信号和槽的传参,断开,对lambda表达式的使用,信号和槽的优缺点

分享技术 2876

学习qt关于信号,槽的的一些小总结

QT信号和槽: 我们举一个很简单的例子:我是阿拉丁,我捡到了一个神灯(我们都知道的一个寓言故事),那么 我擦拭灯,灯内飞出灯神,这样灯神就能实现我的三个愿望(hhh) 那么,我就是信号的发出者,擦拭灯这个动作,就是信号,灯,就是信号的接收者,灯神出来,就是信号的反应,也就是槽 1.信号: 使用signals关键字声明,只要有函数声明,不需要实现 可以自定义信号 没有返回值    void 可以带参数 **:void sig1(int ,double,QString)&nb

qq_45337491的博客 451

学习日志020---qt信号与槽

【代码】学习日志020---qt信号与槽。

Z211613347的博客 441
上一篇: Linux内核代码学习笔记
下一篇: Qt学习之部件创建及资源添加
码农诗人
博客等级 码龄11年 986粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值