unix signal
首先我们大致联想一下unix(linux)下的信号设置方法
产生者(键盘) | 接受者.c | 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();
如下图:
2)实现:
在widget.cpp中对函数进行实现
void sig(){ printf("要实现的功能\n"); } */
"不需要":跳过发送
2.接受以及槽实现
1)接受即绑定 connect(ui~>btn_data,SIGNAL(clicend(bool),this, SLOT(doProcessCilck(bool)))
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文件下编写槽函数的实现;