6.手动实现信号于槽的连接过程

手动设置信号

unix signal

首先我们大致联想一下unix(linux)下的信号设置方法

产生者(键盘)接受者.c绑定[signal(id,xxx)]xxx函数处理
键盘(kill) signal.c singnal(SIGUSR1,do_process) void do_process(int signo);
 //产生者(键盘)
    Kill -SIGUSR1 id//id为进程id即getpid()得到的值;
    Kill -SIGUSR2 id

 
//接受者.c
 void do_process(int signo);
 int main(){
     prinf("current pid:%d\n",getpid());
     singnal(SIGUSR1,do_process);//当收到信号SIDUSR1时执行后面的函数
     singnal(SIGUSR2,do_process);
     while(1)
     {
         sleep(1);
     }
     return 0;
 }
 void do_process(int signo){
     if(signo==SIGUSR1){
         printf("SIGUSR1\n");
     }else if(SIGUSR2==signo){
         printf("SIGUSR2\n");
     }else {
         printf("unknow signo\n");
     }
 }

QT 信号与槽

产生者(按钮等)接 收者绑定[connect()]可以是当前对象或槽去处理
PushButton ->clicked() this connect(ui~>PushButton, SIGNAL(clicked(bool), this,SLOT(doProcessClick(bool))); void</br>doProcessClick(bool)

//cpp中声明写在头文件(.h),实现写在.cpp中

思考过程

  1.首先(发送), 判断QT中是否需要自己发送信号的实现

   "需要":

/* 1)声明:

在widget.h(widget只是个举例)的类内声明

signals://signals事件和public用法在这里相似一个是声明前者声明功能后者声明权限 void sig();

如下图: image-20200319122351554

2)实现:

   在widget.cpp中对函数进行实现

     void sig(){ printf("要实现的功能\n"); } */

   ​ "不需要":跳过发送

2.接受以及槽实现

1)接受即绑定 connect(ui~>btn_data,SIGNAL(clicend(bool),this, SLOT(doProcessCilck(bool)))image-20200319133701653

2)声明: 在widget.h(widget只是个举例)的类内声明

ptivate slots: void doProcessCilck(bool); // ptivate slots:事件和public用法相似

   
拓展:
    1、signals前面不可加public、private和protected进行修饰;slots前面可以加,因为Qt说槽函数可以当普通函数使用。

    2、signals区域的函数必须是void类型,而且这些信号函数没有函数体,也就是说不可以自己定义这些信号函数,你只要声明它就够了,其它不用管,Qt内部自己弄。

    3、宏定义和函数指针不能用于信号和槽的参数,信号和槽也不能有缺省参数。
3)实现: 在widget.cpp文件下编写槽函数的实现;

}

原文地址:https://www.cnblogs.com/lxuechao/p/12521624.html