信号与槽
目录
1. 信号和槽概述:
信号的三要素:
1.1 信号源:
1.2 信号类型:
1.3 信号的处理方式(槽):
2. 信号和槽的使用:
2.1 连接(关联)信号和槽:
connect() 函数原型:
案例:
2.2自定义槽函数:
2.2.1 代码自定义槽函数:
2.2.2 Qt Creator自定义槽函数:
2.3 自定义信号:
2.4 带参数的信号和槽:
2.5 disconnect 断开信号和槽函数的连接:
2.6 lambda构造槽函数:
1. 信号和槽概述:
信号的三要素:
1.1 信号源:
由什么控件发出的信号。
1.2 信号类型:
用户的不同操作就会触发不同的信号。
(eg.点击按钮,勾选复选框,在输入框中移动光标)
1.3 信号的处理方式(槽):
Qt中可以用connect函数,把一个信号与一个槽关联起来,
实现只要信号触发,就自动执行槽函数。
2. 信号和槽的使用:
一个类中必须有宏Q_OBJECT才能使用信号和槽

2.1 连接(关联)信号和槽:
在Qt中,QObject类提供了⼀个静态成员函数connect(),该函数专⻔⽤来关联指定的信号函数和槽 函数。

connect() 函数原型:

案例:
界面上包含一个按钮,点击按钮,关闭窗口。
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPushButton* button = new QPushButton(this);button->setText("关闭");button->move(300,300);connect(button,&QPushButton::clicked,this,&Widget::close);
}Widget::~Widget()
{delete ui;
}
2.2自定义槽函数:
2.2.1 代码自定义槽函数:
自定义一个槽函数和定义一个成员函数一样。
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPushButton* button = new QPushButton(this);button->setText("按钮");button->move(300,300);connect(button,&QPushButton::clicked,this,&Widget::HandleClicked);
}Widget::~Widget()
{delete ui;
}void Widget::HandleClicked()
{this->setWindowTitle("按钮已经被按下!");
}
Qt4定义槽函数时:
2.2.2 Qt Creator自定义槽函数:

不需要进行手动连接,只需要定义槽函数内容即可。


2.3 自定义信号:

现在不写emit也可以。

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(this,&Widget::mySignal,this,&Widget::handleMySignal);
}Widget::~Widget()
{delete ui;
}
void Widget::handleMySignal()
{this->setWindowTitle("自定义信号和槽函数");
}void Widget::on_pushButton_clicked()
{emit mySignal();
}
2.4 带参数的信号和槽:
信号和槽的参数类型必须一致,信号的参数个数>=槽的参数个数。
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(this,&Widget::mySignal,this,&Widget::handleMySignal);
}Widget::~Widget()
{delete ui;
}
void Widget::handleMySignal(const QString& text)
{this->setWindowTitle(text);
}void Widget::on_pushButton_clicked()
{emit mySignal("带参数的信号");
}
2.5 disconnect 断开信号和槽函数的连接:
可以断开之前连接的信号与槽。

2.6 lambda构造槽函数:
lambda:


