Qt的信号槽,一个老MFC的经验
最近在利用闲暇时间研究Qt,大概有3周了,看过了官网的white paper并浏览了一遍<C++ GUI Programming with Qt 4, 2nd Edition>。总的来说,感触还是很深的,所以今天想写点东西,作为对Qt初体验的记录。
本人作为一个MFC老古董(如果你关注本博的话,你是知道的,汗~),发现研究Qt是一件非常令人赏心悦目的事情。那感觉,就像你逛完了集美家具城看到一堆国产风格的家具后突然走进宜家的卖场一样。我并不是说宜家的家具有多么好,只不过宜家家具代表的北欧风格和家具的设计思路和国产的比较起来是那么的不同,让人印象深刻。可能都是来自北欧的缘故吧,Qt的设计和宜家家具的设计都让我感到了那股北欧的简洁、质朴、某些地方又非常巧妙的风格。感谢北欧几个国家的人民,为我们带来了安徒生童话、Nokia手机、ABBA乐队……当然还有Qt。
喜欢Qt,当然还是从它的Signals & Slots开始。这个概念的提出是让人非常钦佩的。如果你写过10万行代码,仔细想一下,除了用于计算和处理事务的代码外,其它的代码都是在干什么的?没错,你写了X个响应Windows消息的函数,调用了Y次成员变量的方法,执行了Z个回调函数……你不过是在通过不同的方法与对象或某段代码沟通,让它们去执行某些代码而已。这个沟通的过程,有时候是非常麻烦的,甚至需要调整程序的构架和实现。在MFC中,当你不得不一次又一次继承、修改Message Map,并为代码的高耦合性和重复性头疼不已时,是否想到过别的解决方案呢?对于纯OO的编程来说,每个对象执行一些特定的操作,所有的对象通过沟通来共同执行所有的操作,完成整个软件的功能。在Qt里,Signals & Slots是Objects之间完美的沟通方式,它允许所有继承QObject的子类们随心所欲的沟通,即使在不同的线程中。知道每次当我想到这里的时候是什么心情吗?我要给Eirik鼓掌,大声地,长时间地鼓掌……
只有一个好的点子是不够的,当你研究Qt源代码时就会发现,为实现一个好的点子,通常要付出艰辛的努力。Let’s make things happen.不知各位听到这句话时一般有什么反应。Haavard和Eirik即使在没挣到1分钱而需要老婆养活的那几年也能把Qt这个事业坚持下来,并坚持了将近20年。这份执着更让人敬佩。有时候静下心来想一想,我们中国人好像是太聪明了,有时候缺乏那种执着和愚钝。当然,这跟国情也有关系,在中国,本土企业想做个世界级的ISV太难了,想盈利都很难(网游除外),更不用提开源软件了。那些优秀的程序员和软件从业者,难道中国真的没有适合你们大展拳脚的土壤吗?
言归正传,再说回Qt的特色。与MFC对比起来,你会发现Qt的设计是那么的直白。很多地方的解决方案是你第一次就想到的那一种。感觉在Qt中,没人会觉得你的想法简单。关键在于你能把问题解决。经过了10几年和无数个平台的洗礼,简单的事情就没那么简单了。Keep It Simple & Stupid (KISS),有的时候,我们想得太多了。
关于Signals & Slots我想再多说一句。在做木工活时,你知道一个好工具的重要性。它直接决定了你的工作是不是很辛苦,和能做出的东西是什么样的。Signals & Slots在Qt中就是那个先进的工具,有了它,很多事情就不一样了,整个Qt的构架也不一样了。可以看出,对于一个公司或一款软件来说,一个优秀的系统级程序员是一笔多么宝贵的财富。
今天先写到这里,我的下面几篇文章将围绕一个Qt程序展开,我会分几步写成一个类似Qt Demo的界面程序。在这个过程中,我会将Qt中的一些特色做个介绍,同时我会与MFC中的某些概念进行对比。有兴趣的TX,请关注本博。
http://blog.csdn.net/superjoel/article/details/4889729
Qt的信号槽,一个老MFC的经验的更多相关文章
- VJGUI消息设计-兼谈MFC、QT和信号/槽机制
星期六下午4点,还在公司加班.终于写完了下周要交工的一个程序. 郁闷,今天这几个小时写了有上千行代码吧?虽然大部分都是Ctrl-C+Ctrl-V,但还是郁闷. 作为一个有10年经验的MFC程序员,郁闷 ...
- Qt学习记录--02 Qt的信号槽机制介绍(含Qt5与Qt4的差异对比)
一 闲谈: 熟悉Window下编程的小伙伴们,对其消息机制并不陌生, 话说:一切皆消息.它可以很方便实现不同窗体之间的通信,然而MFC库将很多底层的消息都屏蔽了,尽管使用户更加方便.简易地处理消息,但 ...
- C++11实现Qt的信号槽机制
概述 Qt的信号槽机制是Qt的核心机制,按钮点击的响应.线程间通信等都是通过信号槽来实现的,boost里也有信号槽,但和Qt提供的使用接口很不一样,本文主要是用C++11来实现一个简单的信号槽,该信号 ...
- 非Qt工程使用Qt的信号槽机制
非Qt工程,使用Qt的信号槽机制,蛋疼不?反正我现在就是要做这样一件蛋疼的事. 要使用Qt的信号槽机制,下面是从Qt Assist里面关于 signal & slots 的一句介绍: All ...
- Qt Connect 信号 槽
信号和槽机制是 QT 的核心机制 .信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT 区别于其它工具包的重要地方.信号和槽是 QT 自行定义的一种通信机制,它独立于标准 ...
- 在非UI线程中更改UI(Delphi使用隐藏窗口来处理,QT使用信号槽)
在Delphi里我记得是使用TThread.Synchronize(TThreadMethod),原理是利用了一个隐藏窗口来处理. 在QT Debug模式一下,碰到了同样的问题,显示错误: canno ...
- 使用 C++11 编写类似 QT 的信号槽——上篇
了解 QT 的应该知道,QT 有一个信号槽 Singla-Slot 这样的东西.信号槽是 QT 的核心机制,用来替代函数指针,将不相关的对象绑定在一起,实现对象间的通信. 考虑为 Simple2D 添 ...
- Qt自定义信号槽的使用浅析+实例
1. Qt中自定义信号槽的使用 Qt框架提供的信号槽在某些特定场景下是无法满足我们的项目需求的,因此我们还设计自己需要的的信号和槽,使用connect()对自定义的信号槽进行连接. 如果想要使用自定义 ...
- qt多线程信号槽传输方式
//简单介绍一下QT信号与槽的连接方式: //Qt::AutoConnection表示系统自动选择相应的连接方式,如果信号与槽在同一线程,就采用Qt::DirectConnection, //如 ...
随机推荐
- java课程设计(计算器)
JAVA课程 设 计 报 告 1206401-18 瞿杰 一.设计时间 2013年6月 24日-----6月28日 二.设计地点 湖南城市学院实验楼计算机506机房 三.设计目的 1.巩固学习VB ...
- ios网络学习------8 xml格式数据的请求处理 用代码块封装
#pragma mark 载入xml - (void)loadXML { //获取网络数据. NSLog(@"load xml"); //从webserver载入数据 NSStri ...
- gdbserver 安卓apk
gdbserver 调试程序 底层调用c/c++ 动态库, 动态库带调试选项 查看手机IP 192.168.1.177 包所调用的c/c++ 库是在/data/data/包名/lib/ 下 1.将安 ...
- 如何解决Android 5.0中出现的警告:Service Intent must be explicit
有些时候我们使用Service的时需要采用隐私启动的方式,但是Android 5.0一出来后,其中有个特性就是Service Intent must be explitict,也就是说从Lollip ...
- Android导航栏ActionBar的具体分析
尊重原创:http://blog.csdn.net/yuanzeyao/article/details/39378825 关于ActionBar,相信大家并不陌生,可是真正能够熟练使用的也不是许多,这 ...
- C语言字符转换ASCII码
//函 数 名:CharToHex()//功能描述:把ASCII字符转换为16进制//函数说明://调用函数://全局变量://输 入:ASCII字符//返 回:16进制///////// ...
- php如何开启GD库
GD库是干什么用的呢!它是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片.GD库在php中默认是没有开启的,如果想让它支持图片处理功能,那么就要手 ...
- codeforces 508D . Tanya and Password 欧拉通路
题目链接 给你n个长度为3的子串, 这些子串是由一个长度为n+2的串分割得来的, 求原串, 如果给出的不合法, 输出-1. 一个欧拉通路的题, 将子串的前两个字符和后两个字符看成一个点, 比如acb, ...
- Python collections.defaultdict 笔记
其实defaultdict 就是一个字典,只不过python自动的为它的键赋了一个初始值.这也就是说,你不显示的为字典的键赋初值python不会报错,看下实际例子. 比如你想计算频率 frequenc ...
- ForeignKey.on_delete
当由一个 ForeignKey 引用的对象被删除,默认情况下,Django模拟SQL的 ON DELETE CASCADE 来删除对象的 ForeignKey 关系.这样可以覆盖指定的 on_dele ...