Qt笔记 信号和槽

在Qt中,如何将两个对象进行关联,让一个对象发出信号,然后另外一个对象接收到信号后,执行该对象的一个方法,要实现这种方式,则需要使用到信号和槽机制。

信号:

信号一定是一个没有返回值的函数,但是参数可以声明为有,也可以声明为没有。而且信号不需要实现只需要其类中进行声明。可以认为信号不是一个函数,而是一个函数的声明。

如:

cpp 复制代码
class A : public QObject
{
    Q_OBJECT
public:
    // ...

signals:
    void Asignal();

    // ...
};

在定义信号和槽相关的类的时候,有几点是需要注意的:

  1. 首先要想使用信号和槽,必须要从QObject来进行派生,因为只有QObject类以及其子类才能包含有信号和槽。

  2. 必须包含有Q_OBJECT

槽:

槽是一个实实在在的函数,既要进行声明也要实现,这点上和c++中常规的函数没有什么区别,但是槽的返回值一定void类型,槽可以有参数,参数的类型和数量完全取决于你的需求,槽对参数并没有限制。

如:

cpp 复制代码
class MyClass : public QObject
{
    Q_OBJECT
public:
    // ...

public slots:
    void mySlot(int parameter1, QString parameter2);

    // ...
};

// 在cpp文件中
void MyClass::mySlot(int parameter1, QString parameter2)
{
    // 槽的实现
}

信号和槽如何配合使用?

我们使用使用connect来将发生者,发送的信号,接收者,接收后进行的动作绑定在一起,在connect中的实现即为:

cpp 复制代码
connect(sender, signal, recipient, fuction);

其中的所有参数都是地址,不要搞错了。

举个例子:

cpp 复制代码
connect(ui->pushButton, &QPushButton::clicked, this, &widget::close);
//这里是使用Qt中默认的信号和信号槽来实现绑定

这样就可以实现点击ui文件中的pushButton,生成一个clicked点击信号,然后widget界面接收到该信号,执行close方法。

其中的widget中的私有成员指针ui指向ui文件生成的界面,这个界面对应的代码中的组件都是以指针的方式存在。

我们知道c++不能使用像"类::成员函数"这样的方式来获得成员函数的地址,因此可以再前面加一个&作为标记符(而不是取地址的意思),来告诉编译器,这个是一个成员函数的地址,这样才能让编译器来获得正确的成员函数地址。

如何自定义信号和信号槽?

  1. 在ui界面实现组件转到槽

这样会直接在widget中生成一个信号槽,且该按钮直接关联到该信号槽,点击即可出发信号槽。

  1. 如果信号所在的类无法直接发出信号,则在组件跳转槽中抛出一个连接好的信号槽所需的信号,从而实现间接连接信号和信号槽
相关推荐
Cc.Y1 分钟前
Java零基础入门:类与对象深度掌握 —— 从“零散变量“到“打包管理“
java·开发语言·python
\光辉岁月/3 分钟前
2.java变量
java·开发语言·变量
夏天的清晨19 分钟前
C++入门学习
开发语言·c++·学习
新鲜势力呀22 分钟前
PHP 文件上传系统实战:从上传卡顿到分片上传 + 秒传 + 云存储架构完整优化方案
开发语言·架构·php
程序员老陆38 分钟前
从语法糖到类型系统:深度拆解 C++ Lambda 与可调用对象的“血缘关系”
开发语言·c++·程序设计
(Charon)39 分钟前
【C++面试】设计模式:手写单例模式与工厂模式
开发语言·c++
估值探索者40 分钟前
【Python量化系统工程实战 #01】数据存储选型 CSVSQLiteMySQL 对比与 SQLite 实战建库
开发语言·jvm·python·sqlite·api接口·数据api接口·股票数据api接口
根目录下的猫1 小时前
ROS 2 C++(rclcpp)版本,实现话题订阅、话题发布,以及完整编译运行流程
开发语言·c++·算法
сокол1 小时前
【Python-基础-环境搭建】Ubuntu Python 开发环境搭建:编译、pipenv、pyenv、远程连接
开发语言·python·ubuntu
liangshanbo12153 小时前
JavaScript 面试题:Object.keys() 的返回顺序是无序的吗?
开发语言·javascript·ecmascript