• 22053阅读
  • 9回复

初学Qt, 站在MFC角度讨论两问题 [复制链接]

上一主题 下一主题
离线cochlea2007
 

只看楼主 倒序阅读 楼主  发表于: 2010-07-08
— 本帖被 xtfllbl 执行锁定操作(2010-07-08) —
看完C++ GUI Qt 4 编程 第一部分了, 提两问题


对于clicked这样的信号, 是系统自动发射的, 咱用槽响应就好

对于自定义信号, 你必须显式发射.  我既然都显式发射了, 我为啥不直接调用槽函数, 而非要脱裤子放屁, 中间加个发射信号过程呢!!

如果仅仅为了程序的可读性, 也不用这么大费周章啊!!! 我感觉自定义信号显然没有存在的必要啊!


信号槽和 event 功能是不是完全一样的? 就是在具体实现方法上有点差别, 信号槽采用增加一些记录成员的方法, event则完全采用虚函数, 是这样的吗?

你不怕虚函数开销大, 你就采用event. 怕的话, 你就采用信号槽, 这为啥还折中了呢!!!!!!


如果以上两条成立的话, 我感觉 Qt 需要大刀阔斧的改革了

你整出这么多花样, 不明显迷忽人呢吗, 本来编程这玩意就挺难学的, 脑子好的, 绕进去还能绕出来, 脑子不好的, 绕进去出不来了, 易学易用才是王道啊!!!!











离线dbzhang800

只看该作者 1楼 发表于: 2010-07-08
我只想说一句,对自己还不了解的东西,先不要有这么多的抱怨。

对于你提的这些问题,你自己只要写一个自定义控件(比如,继承QWidget来实现一个button),不就都(大致)了解了么?
离线xtfllbl

只看该作者 2楼 发表于: 2010-07-08

脑子好的, 绕进去还能绕出来, 脑子不好的, 绕进去出不来了.

这话说的有点小沈阳的味道,不错,我喜欢。
至于内容,不做评论。
上海欢迎您
离线抠涕
只看该作者 3楼 发表于: 2010-07-08
笑而不语。
离线watera
只看该作者 4楼 发表于: 2010-07-08
signal/slot 就是为了降低代码耦合度,如果你真的站在MFC的角度,就会发现这种机制比MFC老掉牙的消息映射优越太多了。
至于你说的不用自定义信号,直接调用槽函数,请看下面的例子:
假设你有一个父窗口,其中有一个自定义按钮(或其他类,不一定是窗口),你要在按钮被点击时在父窗口中做出反应。但在你设计这个按钮时,你不知道它被谁使用,更不知道这个槽函数是什么,如何直接在按钮中调用你的槽函数?除非你在按钮中放一个函数指针,把外部函数的指针传进来。那么,恭喜你,signal/slot就是函数指针的qt封装版。
signal/slot也不是qt独有的。C#里的委托,boost库里的signal/slot和qt基本相同。
离线watera
只看该作者 5楼 发表于: 2010-07-08
至于你说的易学易用,请你不用visual studio的IDE写一个消息映射出来
离线watera
只看该作者 6楼 发表于: 2010-07-08
第三个问题:
信号/槽的开销比虚函数还要大.
信号实际是一个函数指针的动态数组(比如vector),发射信号就是依次调用这些函数,只不过这些都被qt的moc隐藏起来,看起来美妙,低层十分丑陋,机制和event完全不同
如果低想要知道它具体是怎么实现的,可以参考boost,它里面的signal完全用模板实现,速度比qt快
离线wato
只看该作者 7楼 发表于: 2010-07-08
信号槽是用于对象间通讯的

LZ MFC应该学的也很差
离线cochlea2007

只看该作者 8楼 发表于: 2010-07-08
watera, wato......这两人说话太点晴了
看君一回复, 胜思一整晚啊!!!!

总结如下:
信号槽就是干代码耦合的活的, 举个例子: 设计部专门负责设计图纸, 厂房专门负责生产机器, 生产部负责它们之间的勾通. 信号槽干的就是生产部的活.... 相比MFC确实增加了灵活性

运行过程: 一个输入先经过event, 经过判断再发射信号. 比如鼠标点击, 先触发鼠标点击event(当然中间还经过好几个event函数才到了鼠标点击event了), 经过位置判断, 这个点击点在了控件上, 然后发射clicked信号..............是这样的吗????

小弟确实不才啊!!!! 今年才考上的研究生, 而且还是跨专业考上的计算机研究生, 本科学机械的, 所以上边用机械厂举了个例子, 没啥项目经验, 不能说啥不会, 啥都只知道一点点是肯定的... 路漫漫其修远兮, 吾将上下而求索
离线xtfllbl

只看该作者 9楼 发表于: 2010-07-08
楼主幡然醒悟,结帖。
上海欢迎您