qt信号和槽机制的问题
我是一名大学生,现在在自学Qt,看了信号和槽的机制介绍,还是不太明白这两者之间的关系和工作原理。比如下面一段代码:QObject::connect(scroll,SIGN...
我是一名大学生,现在在自学Qt,看了信号和槽的机制介绍,还是不太明白这两者之间的关系和工作原理。
比如下面一段代码: QObject::connect( scroll, SIGNAL(valueChanged(int)), label, SLOT(setNum(int)) );
1、我搞不明白为什么valuechanged(int)和setnum(int)的输入参数个数和类型必须是一致的?要是说valuechanged(int)的返回参数和 setnum(int)输入参数个数和类型是一致我倒是能理解,实际上是两个输入参数一致我就迷糊了,我想知道其中的原理。
2、如果是信号的参数个数多于槽的参数,那么信号的后面多余的参数就会缺失。这里的缺失是指什么意思,比如valuechanged(int,int)和setnum(int),那原本valuechanged(int,int)里对第二个int参数怎么处理呢。
3、signal和slot关键字已经定义成宏了吗?怎么定义的啊?
本人属于假期自学,但是Qt有些内容和c编程还是有些区别,存在很多迷惑,小弟理解能力有限,自学得也不到位,请各位大神帮帮我。感谢您在百忙之中抽出时间来帮我解答,谢谢啦!祝大家工作顺利、春节快乐! 展开
比如下面一段代码: QObject::connect( scroll, SIGNAL(valueChanged(int)), label, SLOT(setNum(int)) );
1、我搞不明白为什么valuechanged(int)和setnum(int)的输入参数个数和类型必须是一致的?要是说valuechanged(int)的返回参数和 setnum(int)输入参数个数和类型是一致我倒是能理解,实际上是两个输入参数一致我就迷糊了,我想知道其中的原理。
2、如果是信号的参数个数多于槽的参数,那么信号的后面多余的参数就会缺失。这里的缺失是指什么意思,比如valuechanged(int,int)和setnum(int),那原本valuechanged(int,int)里对第二个int参数怎么处理呢。
3、signal和slot关键字已经定义成宏了吗?怎么定义的啊?
本人属于假期自学,但是Qt有些内容和c编程还是有些区别,存在很多迷惑,小弟理解能力有限,自学得也不到位,请各位大神帮帮我。感谢您在百忙之中抽出时间来帮我解答,谢谢啦!祝大家工作顺利、春节快乐! 展开
2个回答
展开全部
你可以把信号和槽的关系理解为函数调用的问题。当你的程序中某处发出了一个信号,例如
emit valueChanged(100),那么相当于你要调用和这个信号相连的槽,即上一句可以理解为调用
setNum(100)。
当然,信号和槽比上述调用要先进,例如可以在含有emit valueChanged(100)的函数执行完成后才调用setNum(100)函数。也可以在执行emit valueChanged(100)的地方调用setNum(100),setNum(100)执行完成后再继续执行下一句。就像“ianynchen”所说的那样相当于函数指针。
既然相当于函数调用,那么信号和槽的参数类型和顺序应该一致。当然如果信号的参数个数多于与其关联的槽的参数个数,多于的这些参数不可能传入槽中,因此被忽略了。
用信号和槽机制可以方便模块化程序设计,也就是说编写模块的时候不用理会发出的信号会被谁接收,接收后会干什么,同理不用理会信号由谁发出,如何发出。你可以试试看如果不用信号和槽机制,让一个模块调用另一个模块的函数,你会发现这时你需要对着两个模块的结构都有了解才能进行下去。
同时信号和槽可以动态链接和unconnect,非常灵活。
信号和槽是QT中的一个非常重要的内容,建议你多花时间学习,灵活运用信号和槽可以大大简化你的程序设计工作。建议你好好看看帮助文档中关于信号和槽的那部分内容。
信号和槽的实现过程实际上是QT将你的源代码翻译了一下,变成了含有_moc的标准CPP源文件,然后才去编译连接。有时间的话你可以对比一下你的源代码和翻译后的含有_moc的源代码.
emit valueChanged(100),那么相当于你要调用和这个信号相连的槽,即上一句可以理解为调用
setNum(100)。
当然,信号和槽比上述调用要先进,例如可以在含有emit valueChanged(100)的函数执行完成后才调用setNum(100)函数。也可以在执行emit valueChanged(100)的地方调用setNum(100),setNum(100)执行完成后再继续执行下一句。就像“ianynchen”所说的那样相当于函数指针。
既然相当于函数调用,那么信号和槽的参数类型和顺序应该一致。当然如果信号的参数个数多于与其关联的槽的参数个数,多于的这些参数不可能传入槽中,因此被忽略了。
用信号和槽机制可以方便模块化程序设计,也就是说编写模块的时候不用理会发出的信号会被谁接收,接收后会干什么,同理不用理会信号由谁发出,如何发出。你可以试试看如果不用信号和槽机制,让一个模块调用另一个模块的函数,你会发现这时你需要对着两个模块的结构都有了解才能进行下去。
同时信号和槽可以动态链接和unconnect,非常灵活。
信号和槽是QT中的一个非常重要的内容,建议你多花时间学习,灵活运用信号和槽可以大大简化你的程序设计工作。建议你好好看看帮助文档中关于信号和槽的那部分内容。
信号和槽的实现过程实际上是QT将你的源代码翻译了一下,变成了含有_moc的标准CPP源文件,然后才去编译连接。有时间的话你可以对比一下你的源代码和翻译后的含有_moc的源代码.
追问
谢谢啦,最佳答案只有一个,要是没给您别介意呀,加个好友吧,QQ:2523415097
展开全部
signal和slot的返回类型都是void,所以你可以认为是要求输入参数个数、类型、返回类型都要求一致。connect接受的是char*,所以实际上SIGNAL、SLOT都是把后面的参数转化为char*。说穿了你可以把signal、slot理解为函数指针,只是因为是指向对象函数的指针,所以先要给出对象指针,然后是函数。信号槽机制实际上无非就是从signal的函数去调用对应的slot函数。所以要求signal、slot的签名必须一致。否则还要另外设置参数的对应方式,就搞得太复杂了。你可以把signals、slots理解为一个扩展宏。这个宏的作用是做一个标记,只能把signal连接到signal或者slot,而不能随便连接到任意的函数。这方面Qt没有boost的灵活。
追问
谢谢大神啦,我的QQ:2523415097,我有问题能不能进一步探讨啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询