• 1778阅读
  • 8回复

[提问]slots是什么魔法? [复制链接]

上一主题 下一主题
离线纹枰老妖
 

只看楼主 倒序阅读 楼主  发表于: 2020-09-24
我在学习Qt时,遇到这种代码写法:


看到后我很纳闷:这个slots是什么关键字?于是去网上查,网友说它只是个宏定义,定义的是一个空白而已。我想既然是空白了,那我去掉这个slots,只用一个private试试,但是程序运行后,并不能展示面积,而如果加上这个slots,程序就能展示面积了。这让我想不通,所以来这里问问诸位,这个slots究竟是怎么定义的?为什么加不加它会有如此大差异
离线liudianwu

只看该作者 1楼 发表于: 2020-09-24
这是Qt的精华,信号槽。
欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线lemonzll

只看该作者 2楼 发表于: 2020-09-24
Qt的源文件会先用moc.exe处理下,生成个moc_xxx.cpp文件。这个slots是给moc.exe看的,所以定义成空的就行了,对C++代码而言没有意义,只是标记下让moc.exe把这个函数登记下
5条评分好评度+1贡献值+1金钱+20威望+1
lieber 好评度 +1 - 2020-09-25
lieber 贡献值 +1 - 2020-09-25
lieber 威望 +1 - 2020-09-25
lieber 金钱 +10 - 2020-09-25
纹枰老妖 金钱 +10 - 2020-09-24
离线纹枰老妖

只看该作者 3楼 发表于: 2020-09-24
回 liudianwu 的帖子
liudianwu:这是Qt的精华,信号槽。 (2020-09-24 14:08) 

我实在是想不明白,那里的slots是什么样的宏定义,能给程序带来这样的差异。可以的话,大佬您能不能把自己当成编译器,解释下这句【private slots:】在您眼里是什么样子的?我的意思是,如果那个slots真的是宏定义,您可以帮我展开让我看一下它的终极样子吗?
离线rpdhunter

只看该作者 4楼 发表于: 2020-09-25
回 纹枰老妖 的帖子
纹枰老妖:我实在是想不明白,那里的slots是什么样的宏定义,能给程序带来这样的差异。可以的话,大佬您能不能把自己当成编译器,解释下这句【private slots:】在您眼里是什么样子的?我的意思是,如果那个slots真的是宏定义,您可以帮我展开让我看一下它的终极样子吗? (2020-09-24 17:29) 

没学过Qt吧,零基础理解起来还是很有难度的,建议找本Qt书从头学起。

简单滴说,这是Qt独有的信号槽(signal-slot)机制,可以在以QObject为基类的类对象之间灵活传递数据,在头文件中signals关键字(原理是宏,但可以把它当做关键字)后面的是信号声明,slots关键字后面的是槽声明,然后在源文件中用QObject::connect()函数把信号和槽连接起来,就能使用了
离线rpdhunter

只看该作者 5楼 发表于: 2020-09-25
回 纹枰老妖 的帖子
纹枰老妖:我实在是想不明白,那里的slots是什么样的宏定义,能给程序带来这样的差异。可以的话,大佬您能不能把自己当成编译器,解释下这句【private slots:】在您眼里是什么样子的?我的意思是,如果那个slots真的是宏定义,您可以帮我展开让我看一下它的终极样子吗? (2020-09-24 17:29) 

具体深究moc的宏展开机制没有必要,因为这实在太复杂了,不是资深c++程序员很难看懂
对于入门级别的Qt使用者,会用这个机制就足够了
1条评分金钱+3
纹枰老妖 金钱 +3 - 2020-09-25
离线青空飞羽

只看该作者 6楼 发表于: 2020-09-25
回 纹枰老妖 的帖子
纹枰老妖:我实在是想不明白,那里的slots是什么样的宏定义,能给程序带来这样的差异。可以的话,大佬您能不能把自己当成编译器,解释下这句【private slots:】在您眼里是什么样子的?我的意思是,如果那个slots真的是宏定义,您可以帮我展开让我看一下它的终极样子吗? (2020-09-24 17:29) 

这个涉及到Qt的元编译器moc了,moc会先把signal这些Qt自己定义的关键字展开为一些标准C++代码用以实现信号/槽机制等Qt特有的特性
1条评分金钱+5
纹枰老妖 金钱 +5 - 2020-09-25
在线clickto

只看该作者 7楼 发表于: 2020-09-25
Re:回 liudianwu 的帖子
纹枰老妖:
我实在是想不明白,那里的slots是什么样的宏定义,能给程序带来这样的差异。可以的话,大佬您能不能把自己当成编译器,解释下这句【private slots:】在您眼里是什么样子的?我的意思是,如果那个slots真的是宏定义,您可以帮我展开让我看一下它的终极样子吗?


首先,你要知道,signal-slot机制是qt在标准c++之上额外添加的一套元对象处理,具体的可查看在moc操作中生成的moc_xxx.cpp文件。但是相信我,作为初学者的你是不太愿意看第二遍的。比如:
定义槽函数:

展开:不知道什么鬼:



1条评分金钱+7
纹枰老妖 金钱 +7 - 2020-09-25
离线纹枰老妖

只看该作者 8楼 发表于: 2020-09-25
回 lemonzll 的帖子
lemonzll:Qt的源文件会先用moc.exe处理下,生成个moc_xxx.cpp文件。这个slots是给moc.exe看的,所以定义成空的就行了,对C++代码而言没有意义,只是标记下让moc.exe把这个函数登记下 (2020-09-24 15:42) 

非常感谢各位热心朋友的回复。但目前来看,2楼的答案对我最有帮助,因为鄙人比较愚笨,有些答案看的我比较糊涂,但2楼朋友的答案让我搞清楚了大概原理,尤其他的是最后一句话,画龙点睛的效果!很棒!
快速回复
限100 字节
 
上一个 下一个