自定义的信号
信号就是一个函数声明
前面咱们都用的qt组件自带的信号,接下来我们自己写一个信号。
信号只需要在前面加一个signals即可
这个函数不需要实现
参数传了一个自定义的类型
自定义的槽
当有了自定义的信号,咱们再去搞一个自定义的槽。
注意:在自定义的槽函数,前面加了slots,其实也可以不加,但是不加的话,槽函数将无法使用转换成字符串的方式进行关联,因此建议在自定义槽函数时,最好加上slots.
槽函数是必须要做实现的在mainwindow.cpp中
然后咱们用一个按钮点击信号去关联咱们自定义的槽函数
随便教一下大家如何去用代码创建主键。
首先在mainwindow.h中添加按钮的数据类型
要包含头文件QPushButton
然后在mainwindow.cpp中new一个按键,并进行位置和大小的设置,最后设置按钮文字
然后按钮点击信号和我们的自定义的槽进行关联
运行效果:
这样就做到了自定义槽的使用
自定义的信号和槽的结合使用
上面都是用的组件已经有的信号,下面咱们用自己定义的信号和槽来玩玩。
mainwindow.h中
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QPushButton> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE struct people { QString name; int age; }; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); signals: void mySignal(people p);//自定义的信号传自定义的类型 public slots: void mySlot();//自定义的槽 void mySlot2(people p);//自定义的槽 private: Ui::MainWindow *ui; QPushButton*btn; }; #endif // MAINWINDOW_H
mainwindow.cpp中
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QPushButton> #include <QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); btn=new QPushButton(this); btn->setGeometry(200,200,100,50); btn->setText("超级大按钮"); qRegisterMetaType<people>("people"); //connect(btn,&QPushButton::clicked,this,&MainWindow::mySlot); connect(btn,SIGNAL(clicked()),this,SLOT(mySlot()));//必须在声明时,前面加slot // connect(this,SIGNAL(mySignal(people p)),this,SLOT(mySlot2(people p))); connect(this,&MainWindow::mySignal,this,&MainWindow::mySlot2); } MainWindow::~MainWindow() { delete ui; } void MainWindow::mySlot() { qDebug()<<"你点到我了"<<endl; people p; p.name="姚国林"; p.age=19; emit mySignal(p);//自己写的信号只能手动发送信号 } void MainWindow::mySlot2(people p) { qDebug()<<p.name<<" "<<p.age<<endl; disconnect(this,&MainWindow::mySignal,this,&MainWindow::mySlot2); }
运行效果:
讲解:
1.connect(this,&MainWindow::mySignal,this,&MainWindow::mySlot2);首先对自定义的信号和槽进行了关联
2.自定义的信号要进行手动发出emit mySignal§;
3.当传的产生类型是自定义的时候,要在关联前加一个qRegisterMetaType(“people”); 其意在Qt中注册一个自定义数据类型people,使其能够在信号和槽之间进行传递。
注意:
信号的参数个数一定要大于等于槽的参数个数
槽的参数类型要与槽的参数类型相对应
信号和槽的断开
当你不想再关联了,或者是防止关联多次,可以使用disconnect进行断开。
当我将disconnect哪行代码进行注释时,我一直点按钮,就会一直输出’你点到我了’和我的信息。
当我添加上这行代码,它只会第一次出现我的信息,后面就关联不上了。
disconnect你要断开那个信号槽,后面就输填入相关的信号槽,跟connect一样。
disconnect的多种形式:
总结:
到这里信号槽也就讲完了。
总的来说信号和槽,都是一个函数
信号是不用做实现的函数
槽是要做具体实现的函数
ui界面的组件都有自己的信号和槽,信号也可以自动发出,我们只需要进行关联即可,手动或者自动关联
如果自定义信号和槽要注意:
- 定义信号前要加signals
- 定义槽函数前最好加上slots
- 参数是自定义的类型,需要加qRegisterMetaType(“class”);
- 只能手动发出信号 emit
也是成功的将信号槽机制讲完了,你一定可以!愿君更上一层楼!
前行的路总是孤独的,也希望能跟大家成为朋友,一起前进!
快来互粉(^-^)V