Qt——信号和槽
信号和槽用于对象间的通讯。信号/槽机制是Qt的一个核心特征,也许是Qt与其它框架提供的特性中最不相同的部分。
简介
在GUI编程中,当我们改变一个部件时,经常想要其他部件被通知。更一般化,我们希望任何一类的对象可以和其它对象进行通讯。例如,如果我们点击一个关闭按钮,我们可能想要窗口的close()函数被调用。
其他工具包通过回调实现了这种通信。回调是一个函数指针,所以如果你希望一个处理函数通知你一些事件,你可以把另一个函数(回调)的指针传递给处理函数。处理函数在适当的时候调用回调。尽管一些成功的框架使用了这个方法,但是回调可能是不直观的,并可能在确保回调参数类型正确性上存在问题。
首先,我们先举个生活中的例子:
人按按钮,电灯打开,照明
在Qt中,我们在窗口中设置了一个按钮(button),然后预期得到一个反馈(比如点击按钮后窗口被关闭了)。
对于以上两件事,在Qt中就是用了信号槽机制来完成的。
引入函数——connect(信号的发送者,发送到具体信号,信号的接收者,信号的处理(槽函数))
信号槽的特点:松散耦合,信号发送端和接收端本身无关联,通过connect()将两端耦合到一起。
代码示例:
首先我们创建一个按钮:
//创建按钮
QPushButton *btn=new QPushButton;
btn->setParent(this);
btn->setGeometry(100,100,90,30);//设置按钮的坐标和大小
btn->setText("点我点我");//设置按钮里的字符
连接函数connect()的使用:
//点击按钮,关闭窗口
connect(btn,&QPushButton::clicked,this,&QMainWindow::close);
接下来,我们将介绍自定义的信号和槽,并自定义触发条件
首先介绍一下这个信号槽的作用:
下课了->老师饿了->学生请老师吃饭
先创造两个类,老师,学生:
点击查看代码
class Teacher : public QMainWindow
{
Q_OBJECT
public:
explicit Teacher(QWidget *parent = nullptr);
signals:
//自定义信号写到signal下
//返回值是void,只需要声明,不需要实现
//可以有参数,可以重载
void hungry();
};
点击查看代码
class Student : public QMainWindow
{
Q_OBJECT
public:
explicit Student(QWidget *parent = nullptr);
signals:
public slots:
//早期Qt版本,槽函数必须写在public slots下,高级的可以写在public或者全局下
//返回值为void,需要声明,也需要实现
//可以有参数,可以发生重载
void treat();
};
再定义一个treat()函数
void Student::treat(){
qDebug()<<"请老师吃饭";
}
和一个classisover()函数:
void MainWindow::classisover()
{
//下课函数,触发老师饿了的信号
emit zt->hungry();
}
创建一个老师和学生的对象
//创建一个老师对象和一个学生对象
this->zt=new Teacher(this);
this->st=new Student(this);
具体的connect()函数:
//老师饿了,学生请客
connect(zt,&Teacher::hungry,st,&Student::treat);
//调用classisover函数
classisover();
以上,是我对Qt中信号和槽的一点理解
本文完
作者:Sky6634
出处:https://www.cnblogs.com/Sky6634/p/16471854.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具