1、一、Qt简介,Qt原为trolltech出品,后被Nokia收购。Logo:Code less, Create more. Develop everywhere.Qt完全基于C+,具有跨平台的能力和国际化支持。应用项目:linux下的KDE,Autodesk的Maya2011,二、实例演示( Qt 自带实例),1. 40000 chips2. Animated Titles3. Dynamic layouts4. Boxes5. Puzzle,二、Qt部件,(一)强大的UI编辑器,Designer(二)类似MSDN的帮助文档Assitant(三)直观的实例展示Qt demo(四)轻量而快捷的I
2、DE:Qt creator(五)翻译工具:Qt Linguist,(一)Designer,1. 所见即所得:几乎所有的图元属性都可以在Designer上直接修改。2. 更多的控件支持:LcdNumber、富文本edit、日历、视频播放、spinBox等3. 图元的坐标显示和控制4. 图元布局(layout)5. 信号/槽编辑器,动作(action)编辑器6. 提升窗口对象(Promote),(二) Assitant,1. IDE中可使用F1快捷方式2. 富文本:更丰富的表现方式3. 查找关键字时的高亮显示4. 简洁而更清晰方便的查找体验5. 与example工程的无缝结合,(三) Qt dem
3、o,1. 直观获取Qt的体验和功能2. 迅速查找示例代码的利器,(四) Qt creator,1. 占用空间小2. 简洁直观的界面显示3. 与Eclipse类似的快捷操作:多行注释(ctrl+/),多行Tab,迅速定位(ctrl+鼠标单击),已打开文件的切换(shift+tab)4 .h和.cpp的切换(F4),迅速返回Edit(Esc)5. 即时语法错误检查和提示6. 查找时的高亮显示,三、signal-slot机制,(一)优点(二)语法(三)使用方法(四)注意事项,(一)优点,1. 比起event/msg机制更为灵活2. 可以传递更多的参数3. 发送方和接受方可以互不知道对方存在,更符合面
4、向对象的设计以及利于金字塔的模式。4. Observer的设计模式5. 线程安全,(二)语法,1. signal是发送方,slot为接收方(也可以是另外的signal)2. 连接方向:多对对,一个signal可以发送给多个slot/signal,多个signal可以发送给一个slot/signal3. signal和slot都可以接受参数,参数类型和个数不限。但是接收方的参数不能大于发送方,参数类型保持一致。4. 祖先类必须是QObject5. .h文件中需要声明宏:Q_OBJECT6. slot可以当作普通function调用,(三)使用方法,1. 定义signal和slot2. 实例化发送
5、者、接收者3. 创建连接:connect ( const QObject * sender, SIGNAL(signal_method), const QObject * receiver, SLOT(slot_method) )4. 发送信号emit signal,(四)注意事项,1. 祖先类必须是QObject,添加Q_OBJECT宏2. connect之前,发送方和接收方必须先创建3. connect之后,发送方或接收方的指针指向新的实体,连接不会自动更新,需要重新建立。4. 有些特殊情况,需要先断开连接,使用disconnect5. 当发送方或接受方有一个销毁后,连接自动断开6. 使用
6、自定义的类型作为参数时,需要先使用qRegisterMetaType注册类型。7. 线程间的交互建议使用signal-slot 8. 所有建立的连接会记录在一个列表,并通过锁保护,所以减少不必要的连接,四、Qt特性,1. 跨平台和国际化支持2. No IDD/IDC,No hwnd,No doc3.更好的M/V/C框架4. 跟Vc相比,更面向对象:没有结构体;图元表现的变更只需要改变其属性,基本不需要重载事件;代码更简洁5. 更好的库设计:例如QImage,几乎支持所有图片类型;set/get的对应6. 更好的库封装,感觉像使用Java。 例如QTcpSocket和QTcpServer,QPo
7、lygon和QVector,7. 更强大的库支持: xml/script文件读写 数据库操作 Opengl支持:QtOpenGL模块; OpenVG支持: QtOpenVG模块 算法支持:base64/hash/md4/md5/sha18. 简单的类型转换。 所有的常用类型可以跟QString自由转换,另外QString支持utf8unicodeasciilatin1 使用方式:QString.toInt(),QString:number()QString.toUtf8(),QString.fromUtf8()9. 更细腻的界面表现: QPointF, QLineF10. 拖放机制和动态机制1
8、1. 简单的头文件包含方式: #include , #include 12. 开源,五、Qt库分类简介,(一)Qt模块一览(二)绘图相关类(三)容器类(四)数据库操作类(五)文件读写类(六)网络通信类(七)动态效果类,(八)拖拽机制类(九)类型转换(十) QtGlobal,(二)绘图相关类,图元的基类:QWidget图元:QDialog, QPushButton,QLabel, QLineEdit, QComboBox, QListWidget, QTableWidget, QMainWindow, QMenu, QDockWidget绘图:QPen,QBrush ,QPainter图形:QR
9、ectF,QLineF,QPointF, QPolygonFQTransform: 支持平移/旋转/缩放QStyle: 界面风格QSrocallArea:自动添加滚动条,(三)容器类,强大的容器类,包括Qvector,Qlist,QLinkedList ,Qqueue,Qmap,QMultiMap,QHash,QMultiHash,qset泛型指针: iterator和const_iterator泛型算法:QtAlgorithms,(四)数据库操作类,QSqlDatabase:建立连接QSqlQuery:查询和操作,(五)文件读写类,文件基本操作:QFile文本文件操作:QTextStream
10、 二进制文件操作:QDataStreamXml文件操作:QXmlStreamReader和QXmlStreamWriter脚本文件操作: QScriptValue sc; QScriptEngine engine; sc = engine.evaluate(“jsonString”); QScriptValueIterator it(sc); while (it.hasNext() it.next(); qWarning() it.name() it.value(); ,(六)网络通信类,TCP:QTcpServer和QTcpSocketUDP:QTcpSocketHttp:QHttp,QHt
11、tpHeader,(七)动态效果类,基本属性设置:QVariantAnimation,QPropertyAnimation组设置:QParallelAnimationGroup,QSequentialAnimationGroup平滑和控制曲线:QEasingCurve,(八)拖拽机制类,需要设置属性: setAcceptDrops(true)Qdrag/ QMimeData事件:void dragEnterEvent( QDragEnterEvent * event )void dragMoveEvent (QDragMoveEvent * event )void QWidget:dropEv
12、ent ( QDropEvent * event ),(九)类型转换,类型的基本类: QVariant常用类型建议使用QString转换转换方式:from/to,(十) QtGlobal,跨平台类型:quint8, quint16, quint32, quint64调试信息: qWarning() list.size();常用方法:qAbs(), qMin() , qMax(),六、开发经验,qApp: 全局指针, application的实例Undefined refference to vtable,一般为signal/slot语法错误(O_BJECT宏未添加或非Qobject派生类)。如
13、果语法没问题,.pro文件重新添加头文件Socket 只能作为指针传递,传递后如果需要调用socket的方法,需要通过signal/slot添加模块需要相应在pro文件中添加该模块已创建的app工程,如果需要添加GUI模块,main.cpp中的QCoreApplication需要改为QApplication可使用Signal/slot替代回调,销毁: 可以借助Delete later(),例:Connect( this, SIGNAL(close(), socket, SLOT(Delete later() ); 另外可以通过parent,parent析构时会delete子类使用QScrollArea时,更新窗口应当调用QScrollAred.widget()-update();,七、环境搭建,所需构件:Qt库+gcc+IDEQt库需要根据平台下载:分win、linux、macIDE可为:Qt Creator, VS, Ecllipse, Code blocksVS和Ecllipse需要下载插件,