对于信号和槽的部分我们这里算是大的知识点已经介绍完了,那么本文的重点就是放在对信号槽的一个总结,当然,对于信号和槽我们还有两个小的知识点没有介绍到,即disconnect和lambda表达式在这里的应用。在这里也会一并介绍到。
最后就是信号与槽的一个意义了,咱们了解即可~
咱们既然有了connect用来绑定信号和槽函数,自然而然就有取消绑定的函数,即disconnect,但是有一说一,在实际开发过程中,disconnect用的并不是那么常见,因为disconnect常见的场景都是将原来已经绑定好的信号槽取消绑定再换一个绑定,而大部分情况下呢,信号槽连接之后,就基本上不用管了,所以对于disconnect来说,咱们了解为重,以下是一个基本用法:
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
connect(ui->pushButton,&QPushButton::clicked, this,&Widget::Handle_1);
}
Widget::~Widget()
{
delete ui;
}
void Widget::Handle_1()
{
this->setWindowTitle("我是大王");
}
void Widget::Handle_2()
{
this->setWindowTitle("我是小王");
}
void Widget::on_pushButton_2_clicked()
{
disconnect(ui->pushButton,&QPushButton::clicked, this,&Widget::Handle_1);
connect(ui->pushButton_2,&QPushButton::clicked, this,&Widget::Handle_2);
}
有个比较有意思的东西就是,当你第一次点击Button_2的时候,窗口的标题并不会修改,因为第一次是要取消连接并且建立连接,第二次点击就可以了。
以上是disconnect函数的基本用法。
接下来是lambda表达式。
使用lambda表达式之前我们不妨简单回忆以下lambda表达式怎么使用的:
[capture](parameters) mutable -> return_type {
// function body
}
其中返回值,参数列表,捕获列表都是可以省略的,但是为了防止我们忘了,那么我们不妨写全一点,以下是lambda表达式的一个基本使用:
auto add = [](int a, int b) { return a + b; };
std::cout << add(2, 3) << std::endl; // 输出: 5
那么你是否思考过为什么lamda表达式可以应用在Qt中吗?
说白了,Qt中的槽就是一个函数,lambda表达式就是一个精简版的函数,对于某些函数比较小,我们完全可以使用lamba表达式来实现。
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// connect(ui->pushButton,&QPushButton::clicked, this,&Widget::Handle_1);
QPushButton* button = new QPushButton(this);
button->setText("按钮");
button->move(200, 200);
connect(button, &QPushButton::clicked,this,[](){
qDebug() << "我复活啦!";
button->move(100,100);
this->move(100,100);
});
}
此时这段代码是错误的,因为没有捕捉,可以理解lambda表达式里面的域是一个单独的,你想要使用外面的东西你就得给人拿进来:
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// connect(ui->pushButton,&QPushButton::clicked, this,&Widget::Handle_1);
QPushButton* button = new QPushButton(this);
button->setText("按钮");
button->move(200, 200);
connect(button, &QPushButton::clicked,this,[=](){
qDebug() << "我复活啦!";
button->move(100,100);
this->move(100,100);
});
}
这里直接选择全部捕获。
效果也是非常明显的,这个就非常有意思了。
当然了,因为lamda表达式是C++11中引用的,在Qt4的版本我们需要修改.pro文件才有用:
以上就是两个小的知识点的一个介绍。
1.理解基本的信号概念和槽的概念:
在这里我们理解到了Linux中的信号和Qt中的信号其实差别没有那么大,可以说挺像的,然后理解了信号和槽本质是一个函数。
2.信号槽的基本使用和如何查阅文档
在这里我们使用了connect函数,并且在文档中查阅发现clicked信号并不是PushButton发出来的,而是它继承的父类发出来的。
3.自定义槽函数和信号函数
在这里我们实现了槽函数的自定义和信号函数的自定义,并且理解了信号函数的一点特殊性,理解了自定义信号其实没有那么多人用~
4.信号槽存在的意义
解耦合:
在软件工程中,对象之间的耦合度就是对象之间的依赖性。对象之间的耦合越高,维护成本越高,因此对象的设计应使类和构件之间的耦合最小。解耦合正是通过设计策略和技术手段,将软件系统中不同组件之间的依赖关系降至最低,实现组件之间的松散耦合。简而言之,解耦合旨在使系统中的各个模块能够独立运行和变化,当一个模块修改时,其对系统其他部分的影响最小化。
5.disconnect的基本使用和lambda表达式的基本使用
在这里我们理解了两个小的知识点在Qt中的基本使用,对于一些一次性使用的函数我们常常写作为lambda表达式,对于disconnect,了解即可~~
感谢阅读!