目录
1.概念
2.信号和槽的使用
2.1代码的方式使用
2.1.1.使用connect关联
2.2图形化界面的方式使用
2.2.1使用流程
2.2.2使用名字关联槽函数
3.自定义信号和槽函数
3.1自定义槽函数
3.2自定义信号
4.总结
1.概念
信号和槽是QT特有的一种机制,信号和槽都是对用户操作的相应。
信号:信号是对用户操作的响应,例:当用户按下按钮时,就会发出信号。
槽:槽或者称作槽函数,是对信号的响应,当信号被发出,与信号关联的槽函数就会相应。
2.信号和槽的使用
2.1代码的方式使用
2.1.1.使用connect关联
template <typename Func1, typename Func2>static inline QMetaObject::Connection connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal,const typename QtPrivate::FunctionPointer<Func2>::Object *receiver, Func2 slot,Qt::ConnectionType type = Qt::AutoConnection)
sender:哪个对象发出的信号
signal:发出的信号类型
recevier:哪个对象处理这个信号
slot:处理信号的槽函数
#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; }
当点击这个按钮的时候,widget这个窗口就会关闭。
2.2图形化界面的方式使用
2.2.1使用流程
1.点击widget.ui自动跳转到设计页面
2.拖拽push Button这个控件
3.右键转到槽
4.选择clicked
他会自动生成并跳转到与这个关联的槽函数
5.编辑槽函数
2.2.2使用名字关联槽函数
使用图形化界面的方式生成的函数,是直接通过函数名字与控件相连的。
1.必须使用这个函数,才能直接用函数名实现connect
[static] void QMetaObject::connectSlotsByName(QObject *object)
函数会递归的搜索,object参数所有的子对象,然后将格式匹配的信号和槽连接起来。、
2.函数名必须遵循这种格式。
void on_<object name>_<signal name>(<signal parameters>);
这样就绑定一起了。
QPushButton *button = new QPushButton(this);button->setObjectName("button");button->move(300,300);button->setText("按钮");QMetaObject::connectSlotsByName(this);void Widget::on_button_clicked() {this->close(); }
3.自定义信号和槽函数
3.1自定义槽函数
1.在头文件 widget类声明槽函数
private slots: //slots是qt特有的关键字void mySlot();
2.在 widget.cpp中定义槽函数
void Widget::mySlot() {this->setWindowTitle("标题1"); }
3.与信号绑定后运行
QPushButton *button = new QPushButton(this);button->setText("按钮");button->move(300,300);connect(button, &QPushButton::clicked, this, &Widget::mySlot);
按下按钮后窗口的标题就会变为标题1
3.2自定义信号
自定义信号,不需要有函数体直接声明即可。
自定义的信号,只能使用emit关键字手动发射信号,其实emit加不加都可以,只是为了可读性罢了。
1.声明一个信号
signals:void mySignal();
2.信号的实现
qDebug会类似cout,qDebug做了一些关于字符集的处理,在打印的时候不会出现乱码。
void Widget::mySlot() {qDebug() << "自定义信号"; }
3.与槽函数绑定并发射
connect(this, &Widget::mySignal, this, &Widget::mySlot);emit Widget::mySignal();
4.自定义带参数的槽函数和信号
信号和槽函数的参数类型必须严格匹配的。
信号的参数可以多于槽函数的参数。
4.总结
信号和槽的机制是QT的特色
优点:1.解耦合,信号和槽函数是解耦合的不互相影响。
2.有多对多的机制(但是没啥用)
缺点:复杂