一、 Qt中的信号槽机制
本质就是给按钮的点击操作,关联上一个处理函数,当用户点击的时候,就会执行这个处理函数。
函数:
static QMetaObject::Connection connect(
const QObject *sender,
const QMetaMethod &signal,
const QObject *receiver,
const QMetaMethod &method,
Qt::ConnectionType type = Qt::AutoConnection);
作用:
Qt中的connect是QObject这个类提供的的静态函数,这个函数的作用就是“连接信号”和“槽”
参数:
sender:信号发出的对象,样例:ui->控件的objectName
signal:发出的信号名称,以字符串形式给出。样例:&QPushButton::clicked
receiver:信号接收的对象,即槽函数所在的对象。
method:接收信号时调用的槽函数名称,以字符串形式给出。
注:
如何访问组件对象,一般通过ui->objectName来访问。
ui->pushButton 通过这种方式就能访问到对应的组件
如果是用代码创建组件,可以直接用对象名
1.在widget.h添加处理函数的声明
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void handleClick();//添加的
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
注:
在声明函数处,按下alt+回车,快速定义
2.添加处理函数的定义
void Widget::handleClick()
{
//当按钮被点击之后,就把按钮中的文本进行切换
ui->pushButton->setText("hello world");
}
3.建立信号和槽的连接
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
connect(ui->pushButton,&QPushButton::clicked,this,&Widget::handleClick);//建立连接
}
4.运行
按下前:
按下后:
二、自定义信号
信号是一类非常特殊的函数
- 程序员只要写出函数声明,并且告诉Qt,这是一个"信号"即可,这个函数的定义,是Qt在编译过程中,自动生成的。(自动生成的过程,程序员无法干预)
- 作为信号函数,这个函数的返回值,必须是void,有没有参数都可以,甚至也可以支持重载
1.自定义信号
//wi
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void handleMySignal();
signals:
void mySignal();//自定义的信号
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
2.连接信号和槽函数
connect(this,&Widget::mySignal,this,&Widget:: handleMySignal);
3.发送信号
发送信号中,使用的关键字:emit
emit mySignal();//运行这个代码就发送mySignal的信号