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