先是百度知道里的对话:
问
看到QT帮助中和一些文档知道,qt 的信号函数并没有函数体,如果没有函数体,如何知道触发了哪个connect函数,也看到好多的信号函数的声明里面的参数只是一个int或者两个int,并没有变量名,那如果这个对象的信号触发了槽函数,那么,该信号传递给槽函数的参数又是什么呢?
回答
只是消息的代称,仅用于触发执行槽函数。 信号声明里的参数就是槽函数的参数,二者声明完全一致的。 看到int甭管,去找槽函数里实际的参数声明就行了。 真实存在的函数只有槽函数一个。
追问
那请问是否这样理解,如果信号里面无参数,那么这个对象的任何变量发生改变,比如定义了一个QPushButton *button = new QPushBuuton("QUIT");connect(button,SIGNAL(clicked()),qApp,SLOT(quit())); 那么button的任何改变都会发射这个消息使得窗口退出,而不仅仅是clicked。 如果有参数,那么这个参数做什么用,是否是检测到这个槽函数的参数发生了改变才会发这个信号?求解释,谢谢
回答
你这不瞎扯嘛。 信号是一个动作触发的,如点击鼠标、按下键盘等, 或者在代码里面使用触发函数触发信号。 跟你说的参数不参数没关系。 比如按钮的click(),鼠标单机就会触发该消息,没有参数。 数字框 QSpinBox的键入数值改变时,会触发valueChanged(int)信号。 信号触发是信号触发,跟参数没关系。信号触发后,有些不需要传递数据,如click(),有些需要传递数据如valueChanged(int), 动作决定信号! 不是参数决定信号。 信号触发后,再看需不需要传参数。 你的理解不对: connect(button,SIGNAL(clicked()),qApp,SLOT(quit())); 这句是将clicked()信号关联到应用程序的退出函数quit()。 单机动作触发clicked()信号,clicked()信号触发后立即执行其关联函数quit(), 由应用程序的quit()结束程序。 这过程中与参数没任何关系,逻辑过程是这样的: 单机按钮-----》触发clicked()------》执行退出函数quit()----》结束。
追问
非常感谢您,我可不可以这样理解,动作跟信号关联?比如您说的这个clicked(),鼠标单击就会触发消息,这个是否是QT内部已经定义好了的? 如果是自定义的信号,怎么关联动作呢?小弟刚学qt,多谢提点!大虾有无这类学习的QQ群或者文章什么的?
回答
鼠标、键盘这类动作操作系统都内定好了的,不用你操心。 自定义信号要看书: C++ GUI Qt 4编程(第二版) Qt高级编程 你自己学吧。
=======================================sno自己的理解==================================
从这里可以看出如何定义一个信号,如何发送一个信号,如何connect一个信号,
定义:
在类中:
signals:
void angleChanged(int newAngle)
关联一个信号:
connect(angle, SIGNAL(valueChanged(int)), cannonField, SLOT(setAngle(int)));发射一个信号(产生信号的动作或来源):void CannonField::setAngle(int angle){
if (angle < 5)angle = 5;if (angle > 70)angle = 70;if (currentAngle == angle)return;currentAngle = angle; ///如果角度和当前的不一样,发射angleChanged信号.update(cannonRect());emit angleChanged(currentAngle);}