QT 中的信号与槽机制详解

news2024/9/24 16:23:36

目录

一、引言

二、信号与槽的基本概念

1.信号(Signals)

2.槽(Slots)

三、声明信号和槽

1.声明信号和槽

2.发射信号 

3.连接信号和槽 

四、高级特性 

1.多信号连接到一个槽

2.一个信号连接到多个槽 

3.断开信号和槽的连接 

4.自定义信号和槽的参数类型 

五、应用场景 

1.用户界面交互

2.模型 - 视图 - 控制器(MVC)架构 

3.多线程通信 

六、总结 


一、引言

        在 Qt 框架中,信号与槽(Signals and Slots)机制是一种强大的事件处理方式,它提供了一种类型安全的回调机制,使得不同的对象之间可以进行高效的通信。与传统的回调函数相比,信号与槽机制更加灵活、安全且易于维护。本文将深入探讨 Qt 中的信号与槽机制,包括其基本概念、使用方法、高级特性以及常见的应用场景。

二、信号与槽的基本概念

1.信号(Signals)

  • 信号是一种特殊的函数声明,它可以在特定的事件发生时被发射(emitted)。信号可以携带任意数量和类型的参数,用于传递事件相关的信息。
  • 例如,一个按钮被点击时,可以发射一个信号,表示按钮被点击了。信号的声明通常使用关键字signals,并且只能在类的声明中进行。

2.槽(Slots)

  • 槽是普通的成员函数,可以被连接到一个或多个信号上。当信号被发射时,与之连接的槽函数将被自动调用。
  • 槽函数可以有不同的参数类型和返回值类型,但必须与连接的信号的参数类型相匹配。槽函数可以在任何 Qt 对象中定义,包括自定义的类。

三、声明信号和槽

1.声明信号和槽

  • 在 Qt 中,信号和槽的声明使用特定的关键字。在类的声明中,使用signals关键字声明信号,使用普通的成员函数声明槽。
  • 例如:
  class MyClass : public QObject
     {
     Q_OBJECT
     public:
         explicit MyClass(QObject *parent = nullptr);
     signals:
         void mySignal(int param1, QString param2);
     public slots:
         void mySlot(int param1, QString param2);
     };

2.发射信号 

  • 在类的实现中,可以使用emit关键字发射信号。发射信号时,需要传递与信号声明中相同类型和数量的参数。
  • 例如:
 void MyClass::someFunction()
     {
         emit mySignal(42, "Hello World!");
     }

3.连接信号和槽 

  • 在 Qt 中,可以使用connect函数将信号和槽连接起来。连接时,需要指定信号的发送者、信号、槽的接收者和槽函数。
  • 例如:
MyClass *obj1 = new MyClass();
MyClass *obj2 = new MyClass();
connect(obj1, SIGNAL(mySignal(int, QString)), obj2, SLOT(mySlot(int, QString)));

四、高级特性 

1.多信号连接到一个槽

  • 一个信号可以连接到多个不同的槽函数。当信号被发射时,所有连接的槽函数将按照连接的顺序依次被调用。
  • 例如:
connect(obj1, SIGNAL(mySignal1(int)), obj2, SLOT(mySlot(int)));
connect(obj1, SIGNAL(mySignal2(QString)), obj2, SLOT(mySlot(int)));

2.一个信号连接到多个槽 

  • 一个信号可以连接到多个不同的槽函数。当信号被发射时,所有连接的槽函数将按照连接的顺序依次被调用。
  • 例如:
connect(obj1, SIGNAL(mySignal(int)), obj2, SLOT(mySlot1(int)));
connect(obj1, SIGNAL(mySignal(int)), obj2, SLOT(mySlot2(int)));

3.断开信号和槽的连接 

  • 可以使用disconnect函数断开信号和槽的连接。断开连接后,当信号被发射时,与之连接的槽函数将不再被调用。
  • 例如:
disconnect(obj1, SIGNAL(mySignal(int)), obj2, SLOT(mySlot(int)));

4.自定义信号和槽的参数类型 

  • Qt 支持自定义信号和槽的参数类型。可以使用 Qt 的元对象系统来注册自定义的类型,以便在信号和槽中使用。
  • 例如:
class MyCustomType
     {
     public:
         int value;
     };
     Q_DECLARE_METATYPE(MyCustomType)
     class MyClass : public QObject
     {
     Q_OBJECT
     public:
         explicit MyClass(QObject *parent = nullptr);
     signals:
         void mySignal(MyCustomType param);
     public slots:
         void mySlot(MyCustomType param);
     };

五、应用场景 

1.用户界面交互

  • 在 Qt 的图形用户界面应用中,信号与槽机制广泛用于处理用户界面事件。例如,当用户点击按钮时,按钮的点击信号可以连接到一个槽函数,用于执行相应的操作。
  • 例如:
class MyWidget : public QWidget
     {
     Q_OBJECT
     public:
         MyWidget(QWidget *parent = nullptr);
     private slots:
         void onButtonClicked();
     private:
         QPushButton *button;
     };
     MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
     {
         button = new QPushButton("Click me", this);
         connect(button, SIGNAL(clicked()), this, SLOT(onButtonClicked()));
     }
     void MyWidget::onButtonClicked()
     {
         qDebug() << "Button clicked!";
     }

2.模型 - 视图 - 控制器(MVC)架构 

  • 在 Qt 的模型 - 视图 - 控制器架构中,信号与槽机制用于实现模型、视图和控制器之间的通信。例如,当模型中的数据发生变化时,可以发射一个信号,通知视图进行更新。
  • 例如:
class MyModel : public QAbstractListModel
     {
     Q_OBJECT
     public:
         explicit MyModel(QObject *parent = nullptr);
     signals:
         void dataChanged();
     public:
         int rowCount(const QModelIndex &parent = QModelIndex()) const override;
         QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
         void addItem(const QString &item);
     };
     class MyView : public QListView
     {
     public:
         MyView(QWidget *parent = nullptr);
     private slots:
         void onDataChanged();
     };
     MyView::MyView(QWidget *parent) : QListView(parent)
     {
         MyModel *model = new MyModel(this);
         connect(model, SIGNAL(dataChanged()), this, SLOT(onDataChanged()));
         setModel(model);
     }
     void MyView::onDataChanged()
     {
         qDebug() << "Data changed. Updating view...";
         update();
     }

3.多线程通信 

  • 在 Qt 的多线程应用中,信号与槽机制可以用于不同线程之间的通信。由于 Qt 的信号与槽机制是线程安全的,因此可以在不同的线程中发射信号和调用槽函数,而无需担心线程同步问题。
  • 例如:
class Worker : public QObject
     {
     Q_OBJECT
     public:
         explicit Worker(QObject *parent = nullptr);
     signals:
         void resultReady(int result);
     public slots:
         void doWork();
     };
     class MainWindow : public QMainWindow
     {
     Q_OBJECT
     public:
         MainWindow(QWidget *parent = nullptr);
     private slots:
         void onResultReady(int result);
     private:
         QThread *thread;
         Worker *worker;
     };
     MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
     {
         worker = new Worker();
         thread = new QThread();
         worker->moveToThread(thread);
         connect(thread, SIGNAL(started()), worker, SLOT(doWork()));
         connect(worker, SIGNAL(resultReady(int)), this, SLOT(onResultReady(int)));
         thread->start();
     }
     void MainWindow::onResultReady(int result)
     {
         qDebug() << "Result: " << result;
     }

六、总结 

        Qt 的信号与槽机制是一种强大的事件处理方式,它提供了一种类型安全、灵活且易于维护的回调机制。通过信号与槽机制,不同的对象之间可以进行高效的通信,使得 Qt 应用程序的开发更加简洁、高效。在实际应用中,可以根据具体的需求灵活地使用信号与槽机制,实现用户界面交互、模型 - 视图 - 控制器架构以及多线程通信等功能。希望本文对大家理解和使用 Qt 的信号与槽机制有所帮助。

 

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

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

相关文章

多融合的信息收集工具--Mitan

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

北京市朝阳区自闭症寄宿学校:为孩子提供优质照顾与学习环境

北京市朝阳区自闭症寄宿学校的愿景与广州星贝育园的卓越实践 在北京市朝阳区&#xff0c;乃至全国范围内&#xff0c;自闭症儿童的教育与照护一直是社会各界关注的焦点。家长们渴望为孩子找到一所能够提供优质照顾与学习环境的学校&#xff0c;让他们在爱与专业的滋养下茁壮成…

trl中的PPO代码解析(炒冷饭版)

不说其他的解释&#xff0c;上来就看代码。建议先对PPO的整体流程有了解。 trl的版本为0.4.0&#xff0c;注&#xff1a;【新版的trl中代码更复杂&#xff0c;如果只是想读懂PPO具体怎么用trl实现的&#xff0c;0.4.0版本即可】 step1: rollout ppo_trainer.generate()函数…

从入门到精通:QT 100个关键技术关键词

Qt基础概念 Qt Framework - 一个跨平台的C图形用户界面应用程序开发框架。它不仅提供了丰富的GUI组件&#xff0c;还包括网络、数据库访问、多媒体支持等功能。 Qt Creator - Qt官方提供的集成开发环境&#xff08;IDE&#xff09;&#xff0c;集成了代码编辑器、项目管理工具、…

2024年AI技术爆发的元年,用对工具,让你副业比主业赚得多!

大家好&#xff0c;我是强哥 文字的力量不容小觑&#xff0c;或许你没有多好的文笔&#xff0c;或许你已经很久没有拿笔写字了&#xff0c;但是没关系&#xff0c;我们有工具&#xff01; AI时代的到来&#xff0c;不会用工具&#xff0c;那你可就OUT了 如果你觉得文字不能赚…

Convert excel format exception.You can try specifying the ‘excelType‘

在使用easyexcel读取文件流获取集合的时候报了这个错 在点进代码抛出异常的地方&#xff0c;发现这么一段逻辑 是通过文件流的前8个字节来判断文件的类型&#xff0c;实际上这种判断规则是无法保证准确的。然后自然的想到是不是引入的jar包版本太旧了&#xff0c;所以有这个b…

Axure大屏可视化模板:跨领域数据分析平台原型案例

随着信息技术的飞速发展&#xff0c;数据可视化已成为各行各业提升管理效率、优化决策过程的重要手段。Axure作为一款强大的原型设计工具&#xff0c;其大屏可视化模板在农业、园区、城市、企业数据可视化、医疗等多个领域得到了广泛应用。本文将通过几个具体案例&#xff0c;展…

安全测试|如何使用burpsuite+xray实现联动测试

目的&#xff1a;安全测试过程中手动分析测试与xray自动化扫描测试结合&#xff0c;这样可以从多层保障安全测试的分析&#xff0c;针对平台业务接口量大的安全测试是十分有用的&#xff0c;可以实现双向测试同时开始。 1.xray 安装和使用 1.1 下载地址&#xff1a;xray commu…

git push错误:Out of memory, malloc failed (tried toallocate 947912704 bytes)

目录 一、错误截图 二、解决办法 一、错误截图 因项目文件过大&#xff0c;http.postBuffer设置的内存不够&#xff0c;所以报错。 二、解决办法 打开cmd窗口&#xff0c;执行如下命令即可 git config --global http.postBuffer 1024000000 如图所示 执行完成以后&#…

WinCC中归档数据片段的时间和尺寸设置

1&#xff0e;归档数据片段介绍工控人加入PLC工业自动化精英社群 1.1 概述 WinCC V6.2 开始的后台数据库采用了MS SQL Server 2005 &#xff0c;所以归档方式与V5 有所不同&#xff0c;它的运行数据存放在数据片段&#xff08;segment&#xff09;当中&#xff0c;工程师可以…

Protobuf:基本概念与使用流程

Protobuf&#xff1a;基本概念与使用流程 基本概念Linux 安装使用流程.proto文件编译使用 运行机制 基本概念 在进行网络编程时&#xff0c;经常需要进行数据传输&#xff0c;只有双方主机都保证数据格式的一致性&#xff0c;才能保证数据被正常解析。这个过程称为序列化与反序…

召回04 离散特征的处理

推荐系统会将一个id映射成一个向量 Qne-Hot编码 Embedding(嵌入)&#xff1a; 把每个类别映射成一个低维的稠密向量

Drive.js 的一些 Api 使用记录

文章目录 2024 年 drive.js 的基础使用想在下一步的时候处理些逻辑呢&#xff1f;(同步)Element 的各种选择器 2024 年 drive.js 的基础使用 安装就跳过了 npm install driver.js &#xff0c;一行代码就可以搞定 官网的 Basic Usage 基础使用的截图如下&#xff1a; 想在下…

C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究

思考这样一串代码的运行结果&#xff1a; #include <iostream> using namespace std; class Person { public:~Person() { cout << "~Person()" << endl; } }; class Student:public Person { public:~Student() { cout << "~Student(…

线程池工作原理?

线程池的工作原理&#xff1a; 当任务过来时&#xff0c;如果线程池中的线程数小于核心线程数&#xff0c;就创建线程。&#xff08;默认情况下&#xff0c;线程池不会预先创建线程&#xff0c;但可以配置&#xff09;当核心线程数满了以后&#xff0c;提交过来的任务会放到阻塞…

Axure9破解

1.下载安装包 通过百度网盘分享的文件&#xff1a;Axure RP 9.zip 链接&#xff1a;https://pan.baidu.com/s/1Lcu-gg4qF8tTkOlt7bC2ww?pwdwmqq 提取码&#xff1a;wmqq 2.设置登录以及破解码 位置&#xff1a;帮助-管理授权-添加key Licensee&#xff1a;123456 Key&#…

Ping32:一站式终端安全解决方案,企业安心之选

在数字化时代&#xff0c;企业的终端安全面临着前所未有的挑战。随着网络威胁的日益复杂化和多样化&#xff0c;如何确保终端设备的安全稳定运行&#xff0c;保护企业敏感数据不被泄露&#xff0c;成为了每个企业必须面对的重要课题。正是在这样的背景下&#xff0c;Ping32作为…

第十四届蓝桥杯嵌入式国赛

一. 前言 本篇博客主要讲述十四届蓝桥杯嵌入式的国赛题目&#xff0c;包括STM32CubeMx的相关配置以及相关功能实现代码以及我在做题过程中所遇到的一些问题和总结收获。如果有兴趣的伙伴还可以去做做其它届的真题&#xff0c;可去 蓝桥云课 上搜索历届真题即可。 二. 题目概述 …

探索LLM中的CoT链式推理:ECHO方法深度解读

近年来&#xff0c;随着大型语言模型&#xff08;LLMs&#xff09;的快速发展&#xff0c;如何有效利用这些模型进行复杂任务的推理成为了研究热点。其中&#xff0c;链式思考&#xff08;Chain-of-Thought, CoT&#xff09;推理方法作为一种有效的策略&#xff0c;能够显著提升…

Redhat 6,7,8系(复刻系列) 一键部署Oracle12c zip

Oracle12c前言 Oracle 12c是甲骨文公司推出的一款关系数据库管理系统,它引入了多项创新特性,如多租户架构、大数据处理和云部署,适用于企业级应用。以下是Oracle 12c的详细介绍: Oracle 12c的主要特点 高性能:通过多线程处理、自动优化等技术,提高了数据库的查询和处理…