老猿在学习ListView组件时,想实现一个在ListView组件中选中一个选择项后触发消息给主窗口,通过主窗口显示当前选中的项的内容。

进入QtDesigner后,设计一个图形界面,其中窗口界面使用Widget组件,在窗口上方一个ListView组件、一个TextBrowser组件和两个PushButton组件,如图:

PyQt Designer中带参数的信号为什么匹配不到带参数的槽函数?_javascript

以上控件中,主窗口名为:win_ListView,ListView控件名为:listView,最上面的TextBrowser控件名为:displaySelected。

老猿在实现鼠标点击ListView时,需要获取当前选择的项目,如是在win_ListView先定义了一个槽函数SelectChange(Index),带一个参数Index,如图:

PyQt Designer中带参数的信号为什么匹配不到带参数的槽函数?_参数类型_02

再定义ListView控件Clicked信号与该槽函数的关系,进入定义界面时却找不到该定义的槽函数,如图:

PyQt Designer中带参数的信号为什么匹配不到带参数的槽函数?_python_03

在在win_ListView控件中没有这个槽函数,按理只要槽函数的参数不多于信号的参数这个槽函数就会可以建立连接。查了很多资料,都没有找到答案,最后想起来信号和槽函数连接必须参数个数满足要求而且要求参数类型相同。而Python没有严格的类型判断,老猿以为只要参数个数相同就可以,实际上由于Qt本身是基于C语言的,PyQt只是在Qt基础上进行了Python的包装转换,因此这个类型很重要。于是将参函数的参数换成了与信号相同的参数名,实际上这不是参数名而是参数类型,一试果然通过了,如图:

PyQt Designer中带参数的信号为什么匹配不到带参数的槽函数?_信号和槽_04

总结: