信号和槽用于对象间的通讯。信号/槽机制是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中信号和槽的一点理解
标签:函数,void,信号,按钮,public,Qt 来源: https://www.cnblogs.com/Sky6634/p/16471854.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。