• 1. 第6章 Qt应用程序开发6.1 Qt4程序设计基础 6.2 Qt Designer应用 6.3 QMainWindow、QDialog、Layout 6.4 Qt4数据库应用 6.5 Qt4多线程应用 6.6 Qt4定时器 6.7 Qt4事件处理 6.8 Qt4网络编程 6.9 QSS样式设计 6.10 QGraphics View应用 6.11 自定义控件
  • 2. 6.1 Qt4程序设计基础Qt简介 Qt的特征 Qt的优势 Qt的开发维护方式 Qt的安装与开发环境的配置 Qt的程序结构和示例 Qt的三个主要基类 Qt中signal(信号)与slot(槽)机制
  • 3. Qt简介Qt是Trolltech(奇趣)公司的标志性产品,是一个跨平台的、开源的、面向对象的C++图形应用程序工具包和UI框架。目前,Nokia已经全资收购Trolltech,成为该产品的直接拥有者和开发者。 Qt 应用程序接口与工具兼容于所有支持平台,让开发员们掌握一个应用程序接口,便可执行与平台非相关的应用开发与配置 Qt/Windows  (Windows XP, 2000, NT 4, Me/98) Qt/Mac  (Mac OS X) Qt/X11  (Linux, Solaris, HP-UX, IRIX, AIX等) Qt对不同平台的专门API进行了 专门的封装(文件处理,网络等) Trolltech公司目前开发两种产品: 跨平台的图形界面设计平台(Qt) 嵌入式系统的应用程序开发平台(Qt/Embedded)
  • 4. (本页无文本内容)
  • 5. 面向对象 Qt具有模块设计和注重软件构件或元素的可重用性的特点 构件支持 Qt提供信号(signal)和插槽(slot)概念,并支持对象之间在彼此不知道对方信息的情况下进行合作,这使得Qt非常适合于真正的构件编程 友好的联机帮助 Qt提供了大量的联机参考文档,有超文本HTML方式,也有Unix帮助页man手册页和补充说明。对于初学者,其中的指南将一步步介绍如何进行Qt编程 便利性 由于Qt是一种跨平台的GUI工具包,它对编程者隐藏了在处理不同窗口系统时潜在的问题,Qt定义了一些类来隐藏在不同操作系统上不同处理方式下的细节问题 Qt的特征
  • 6. 国际化 Qt为本地化应用提供了完全的支持,所有用户界面文本都可以基于消息翻译表被翻译成各国语言,Qt还支持双字节16bit国际字符标准 丰富的API函数 Qt为专业应用提供了大量的函数,在Qt的API中含有大约250个C++类,大多数的类都是GUI专有的 可用户化外观 Qt支持主题,基于Qt的应用程序能够在Windows外观、Motif外观,以及其它一些用户化外观主题之间切换 完整的一套组件工具 Qt编程的基本模块称之为组件,组件是用户界面的组成部分,Qt含有用来创建专业外观的用户界面所需要的所有组件 Qt的特征
  • 7. 第一节 Qt程序设计基础Qt简介 Qt的特征 Qt的优势 Qt的开发维护方式 Qt的安装与开发环境的配置 Qt的程序结构和示例 Qt的三个主要基类 Qt中signal(信号)与slot(槽)机制
  • 8. Qt的优势1、针对多个平台只编写一次代码 使用Qt只需编写一次应用程序和UI,无须重新编写源代码,便可跨不同的桌面和嵌入式操作系统进行部署,既节省了时间又降低开发成本。 2、独特的开发方式 Qt提供了应用程序生成块,包括庞大的可定制widget集合、图形画布、风格引擎和其他内容,开发者可用来生成新颖的用户界面。 3、易学易用的模块化的类库 由于有了Qt模块化的类库,开发者可以更多地关注创新,无须在平台本身编码花费过多时间,这样就可将软件快速推向市场。 4、在单一应用程序中可混合网络和本地代码 Qt集成了WebKit网络渲染引擎,开发者可以快速地将网络内容和服务集成到本地应用程序中,比如使用HTML、XHTML、SVG、CSS和JavaScript。
  • 9. 第一节 Qt程序设计基础Qt简介 Qt的特征 Qt的优势 Qt的开发维护方式 Qt的安装与开发环境的配置 Qt的程序结构和示例 Qt的三个主要基类 Qt中signal(信号)与slot(槽)机制
  • 10. Qt的开发维护方式1、Nokia 主要是由诺基亚Qt Development Frameworks部门开发和维护的。 2、社区 Nokia通过开源授权(LGPL和GPL)以及商业授权的方式对Qt进行授权,这样开源项目就可以使用Qt进行开发。 3、Developer的亲自参与 由于采用公开方式开发Qt,Qt产品规划和源代码库现都已面向公众开放,这样开发者就可以通过为Qt和Qt相关的项目提供代码、翻译、示例和其他方式的贡献。
  • 11. 第一节 Qt程序设计基础Qt简介 Qt的特征 Qt的优势 Qt的开发维护方式 Qt的安装与开发环境的配置 Qt的程序结构和示例 Qt的三个主要基类 Qt中signal(信号)与slot(槽)机制
  • 12. Windows下开发环境的搭建 安装Qt SDK(qt-sdk-win-opensource-2010.03.exe)即可,它是一个完整的Qt开发环境,包括特定版本的Qt库和集成开发环境-Qt Creator IDE。 下载地址:http://qt.nokia.com/downloads-cn Linux下开发环境的搭建-方式1 直接安装Qt SDK(qt-sdk-linux-x86-opensource-2010.03.bin)。 配置Qt的环境变量: 打开/etc/profile文件,在该文件的末尾加上以下语句 PATH=/Qt的安装目录/bin:$PATH QTDIR=/Qt的安装目录 LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH export PATH QTDIR LD_LIBRARY_PATHQt的安装与开发环境的配置
  • 13. Linux下开发环境的搭建-方式2 1、下载(qt-everywhere-opensource-src-4.6.3.tar.gz)。 2、解压: tar zxvf qt-everywhere-opensource-src-4.6.3.tar.gz 3、进入解压后的文件夹,运行configure脚本,配置。 ./configure 4、编译并安装 gmake gmake install Qt的安装与开发环境的配置
  • 14. 配置Qt的环境变量: 打开/etc/profile文件,在该文件的末尾加上以下语句 PATH=/Qt的安装目录/bin:$PATH QTDIR=/Qt的安装目录 LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH export PATH QTDIR LD_LIBRARY_PATH 注意: 1、也可把Qt的bin路径加入用户工作目录下的 .bash_profile或.bashrc文件;把Qt的lib路径加入/etc/ld.so.conf文件中。 2、立即更新配置 source .bash_profile /sbin/ldconfigQt的安装与开发环境的配置
  • 15. 第一节 Qt程序设计基础Qt简介 Qt的特征 Qt的优势 Qt的开发维护方式 Qt的安装与开发环境的配置 Qt的程序结构和示例 Qt的三个主要基类 Qt中signal(信号)与slot(槽)机制
  • 16. Qt的程序结构和示例//hello.cpp 1 #include 2 #include 3 int main(int argc, char **argv) 4 { QApplication app (argc, argv); /*QApplication管理了各种各样的应用程序的广泛资源,比如默认的字体和光标*/ QLabel *hello = new QLabel("

    Hello Qt!

    ”); /*创建了一个QLabel窗口部件,显示HelloQt*/ hello->show(); /*当窗口部件被创建的时候,它总是隐藏的,必须调用show()来使它可见*/ return app.exec(); /*main()将控制权交给Qt。在这里,程序进入了事件循环。事件循环是一种stand-by模式,程序会等待用户的动作(比如按下鼠标或者键盘)*/ 9 }
  • 17. 编译及运行建立一个文件夹hello,把hello.cpp放到文件夹下 qmake –project qmake make ./helloQt的程序结构和示例
  • 18. 初始化 在Qt应用程序中,首先要创建一个QApplication对象,QApplication类负责图形用户界面应用程序的控制流和主设置,在main函数中定义如下: int main(int argc, char **argv) { QApplication a(argc, argv); …… } Qt的程序结构和示例
  • 19. QApplication包含在main()函数的事件循环体中,对所有来自Window系统和其它源文件的事件进行处理和调度,还包括处理应用程序的初始化和结束,并且提供会话管理。 在Qt应用程序中,不管有多少个窗口,QApplication对象只能有一个,而且必须在其他对象之前创建。 QApplication类中封装了很多函数,其中包括: 系统设置:setFont() 用来设置字体 事件处理:sendEvent() 用来发送事件 GUI风格:setStyles() 设置图形用户界面的风格 颜色使用:colorSpec() 用来返回颜色文件 文本处理:translate() 用来处理文本信息 创建组件:setmainWidget() 用来设置窗口的主组件 ……Qt的程序结构和示例
  • 20. 2.组件的创建组件的创建需要调用相应组件的类,并在头文件中包含此类的头文件或者创建自定义类。 #include 实例化该组建的对象: QLabel *hello = new QLabel(“Hello Qt!”); 如果是自定义的组建类,类的声明和实现分别在对应的.cpp 和.h文件中。 组件创建时一般是不可见的,这样的好处在于避免大量组件创建时造成的屏幕闪烁现象,要使组件可见需要调用QWidget类的成员函数show()来显示组件。 hello->show(); Qt的程序结构和示例
  • 21. 3.事件在X程序中,敲击键盘,鼠标指针在窗口中的移动或鼠标按键动作等,都是事件。 在Qt程序中,事件处理的方式是回调,但与以往所不同的是,事件的发出和接收采用了信号(signal)和插槽(slot)机制,无须调用翻译表。 利用信号和插槽进行对象间的通信是Qt的最主要特征之一。 Qt的程序结构和示例4.退出事件 退出事件程序,只需要在程序结束时返回一个exec(),例如: return a.exec(); 其中a为QApplication的实例,当调用exec()将进入主事件的循环中,直到exit()被调用或主窗口部件被销毁。
  • 22. 5.Qt程序处理机制Qt的程序结构和示例 初始化 处理事件 结束Qt应用程序Qt 库请求队列事件队列X server设备相关层计算机键盘鼠标屏幕
  • 23. 第一节 Qt程序设计基础Qt简介 Qt的特征 Qt的优势 Qt的开发维护方式 Qt的安装与开发环境的配置 Qt的程序结构和示例 Qt的三个主要基类 Qt中signal(信号)与slot(槽)机制
  • 24. Qt的三个主要基类 QObject类是所有能够处理signal、slot和事件的Qt对象的基类,原形如下: QObject::QObject ( QObject * parent = 0 ) 在上面的函数中如果parent为0则构造一个无父的对象,如果对象是一个组件,则它就会成为顶层的窗口。 1.QObject
  • 25. class Mandelbrot:public QObject { Q_OBJECT //需要使用signal和slot public : Mandelbrot(QObect *parent=0); …… public slots: void start(); signals: void done(); private slots: void calculate(); private: QTimer timer; …… };Qt的三个主要基类1.QObject
  • 26. //构造初始化一个Mandelbrot对象 Mandelbrot::Mandelbrot(QObject *parent=0, const char *name) :QObject(parent, name) { connect(&timer,SIGNAL(timeout()),this,SLOT(calculate())); …… { Qt的三个主要基类1.QObject
  • 27. QApplication类负责GUI应用程序的控制流和主要的设置,它包括主事件循环体,负责处理和调度所有来自窗口系统和其他资源的事件。 处理应用程序的开始、结束以及会话管理。 对于一个应用程序来说,建立此类的对象是必不可少的。 QApplication是QObject类的子类。 Qt的三个主要基类2.QApplication
  • 28. 函数分组 系统设置 desktopSettingsAware()、setDesktopSettingsAware()、cursorFlashTime()、setCursorFlashTime()、doubleClickInterval()、setDoubleClickInterval()、wheelScrollLines()、setWheelScrollLines()、palette()、setPalette()、font()、setFont()、fontMetrics()。 事件处理 exec()、processEvents()、enter_loop()、exit_loop()、exit()、quit()。 sendEvent()、postEvent()、sendPostedEvents()、removePostedEvents()、hasPendingEvents()、notify()、macEventFilter()、qwsEventFilter()、x11EventFilter()、x11ProcessEvent()、winEventFilter()。 图形用户 界面风格 style()、setStyle()、polish()。 颜色使用 colorSpec()、setColorSpec()、qwsSetCustomColors()。 文本处理 setDefaultCodec()、installTranslator()、removeTranslator()、translate()。 窗口部件 mainWidget()、setMainWidget()、allWidgets()、topLevelWidgets()、desktop()、activePopupWidget()、activeModalWidget()、clipboard()、focusWidget()、winFocus()、activeWindow()、widgetAt()。 高级光标处理 hasGlobalMouseTracking()、setGlobalMouseTracking()、overrideCursor()、setOverrideCursor()、restoreOverrideCursor()。 X窗口系统同步 flushX()、syncX()。 对话管理 isSessionRestored()、sessionId()、commitData()、saveState()。 线程 lock()、unlock()、locked()、tryLock()、wakeUpGuiThread()。 杂项 closeAllWindows()、startingUp()、closingDown()、type()。
  • 29. QWidget类是所有用户接口对象(组件)的基类,它继承了QObject类的属性。 组件是用户界面的单元组成部分,它接收鼠标、键盘和其它从窗口系统来的事件,并把它自己绘制在屏幕上。 QWidget类有很多成员函数,但一般不直接使用,而是通过子类继承来使用其函数功能。如,QPushButton、QListBox等都是它的子类。 QWidget是QObject类的子类。Qt的三个主要基类3.QWidget
  • 30. 上下文 函数 窗口函数 show()、hide()、raise()、lower()、close()。 顶级窗口 caption()、setCaption()、icon()、setIcon()、iconText()、setIconText()、isActiveWindow()、setActiveWindow()、showMinimized()、showMaximized()、showFullScreen()、showNormal()。 窗口内容 update()、repaint()、erase()、scroll()、updateMask()。 几何形状 pos()、size()、rect()、x()、y()、width()、height()、sizePolicy()、setSizePolicy()、sizeHint()、updateGeometry()、layout()、move()、resize()、setGeometry()、frameGeometry()、geometry()、childrenRect()、adjustSize()、mapFromGlobal()、mapFromParent()、mapToGlobal()、mapToParent()、maximumSize()、minimumSize()、sizeIncrement()、setMaximumSize()、setMinimumSize()、setSizeIncrement()、setBaseSize()、setFixedSize()。 模式 isVisible()、isVisibleTo()、visibleRect()、isMinimized()、isDesktop()、isEnabled()、isEnabledTo()、isModal()、isPopup()、isTopLevel()、setEnabled()、hasMouseTracking()、setMouseTracking()、isUpdatesEnabled()、setUpdatesEnabled()。 观感 style()、setStyle()、cursor()、setCursor()、font()、setFont()、palette()、setPalette()、backgroundMode()、setBackgroundMode()、colorGroup()、fontMetrics()、fontInfo()。 键盘焦点函数 isFocusEnabled()、setFocusPolicy()、focusPolicy()、hasFocus()、setFocus()、clearFocus()、setTabOrder()、setFocusProxy()。 鼠标和键盘捕获 grabMouse()、releaseMouse()、grabKeyboard()、releaseKeyboard()、mouseGrabber()、keyboardGrabber()。 事件处理器 event()、mousePressEvent()、mouseReleaseEvent()、mouseDoubleClickEvent()、mouseMoveEvent()、keyPressEvent()、keyReleaseEvent()、focusInEvent()、focusOutEvent()、wheelEvent()、enterEvent()、leaveEvent()、paintEvent()、moveEvent()、resizeEvent()、closeEvent()、dragEnterEvent()、dragMoveEvent()、dragLeaveEvent()、dropEvent()、childEvent()、showEvent()、hideEvent()、customEvent()。 变化处理器 enabledChange()、fontChange()、paletteChange()、styleChange()、windowActivationChange()。 系统函数 parentWidget()、topLevelWidget()、reparent()、polish()、winId()、find()、metric()。 这是什么的帮助 customWhatsThis()。 内部核心函数 focusNextPrevChild()、wmapper()、clearWFlags()、getWFlags()、setWFlags()、testWFlags()。
  • 31. 第一节 Qt程序设计基础Qt简介 Qt的特征 Qt的优势 Qt的开发维护方式 Qt的安装与开发环境的配置 Qt的程序结构和示例 Qt的三个主要基类 Qt中signal(信号)与slot(槽)机制
  • 32. Qt中signal(信号)与slot(槽)机制#include #include int main(int argc, char *argv[]) { QApplication a(argc, argv); QPushButton *button = new QPushButton("Quit"); QObject::connect(button,SIGNAL(clicked()),&a,SLOT(quit())); button->show(); return a.exec(); }
  • 33. 当对象状态发生改变的时候,发出signal通知所有的slot接收signal。 signal和slot机制真正实现了封装的概念,slot除了接收signal之外,和其它的成员函数没有什么不同,而且signal和slot之间也不是一一对应的。 在Qt程序设计中,凡是包含signal和slot的类中都要加上Q_OBJECT的定义。 Qt中signal(信号)与slot(槽)机制 类中定义signal和slot: class Student : public QObject { Q_OBJECT public: Student() { myMark = 0; } int mark() const { return myMark; } public slots: void setMark(int newMark); signals: void markChanged(int newMark); private: int myMark; };
  • 34. signal的发出一般在事件的处理函数中,利用emit发出signal,在下面的例子中在事件处理结束后发出signal。 void Student::setMark(int newMark) { if (newMark!= myMark) { myMark = newMark; emit markChanged(myMark); } }Qt中signal(信号)与slot(槽)机制
  • 35. 在signal和slot声明以后,需要使用connect()函数将它们连接起来。connect()函数属于QObject类的成员函数,它能够连接signal和slot,也可以用来连接signal和signal 函数原形如下: bool connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * slot) 其中第一个和第三个参数分别指出signal和slot是属于那个对象或组件 Qt中signal(信号)与slot(槽)机制
  • 36. 在使用connect()函数进行连接的时候,还需要用到SIGNAL()和SLOT()这两个宏,使用方法如下: QLabel *label = new QLabel; QScrollBar *scroll = new QScrollBar; QObject::connect( scroll,SIGNAL(valueChanged(int)), label, SLOT(setNum(int)) ); Qt中signal(信号)与slot(槽)机制
  • 37. Qt中signal(信号)与slot(槽)机制
  • 38. 同一个信号连接多个插槽 connect(slider, SIGNAL(valueChanged(int)),spinBox, SLOT(setValue(int))); connect(slider,SIGNAL(valueChanged(int)),this, SLOT(updateStatusBarIndicator(int))); 多个信号连接到同一个插槽 connect(lcd, SIGNAL(overflow()),this, SLOT(handleMathError())); connect(calculator, SIGNAL(divisionByZero()),this, SLOT(handleMathError())); Qt中signal(信号)与slot(槽)机制
  • 39. 一个信号连接到另一个信号 connect(lineEdit, SIGNAL(textChanged(const QString &)), this, SIGNAL(updateRecord(const QString &))); 取消一个连接 disconnect(lcd,SIGNAL(overflow()),this, SLOT(handleMathError())); 取消一个连接不是很常用,因为Qt会在一个对象被删除后自动取消这个对象所包含的所有的连接Qt中signal(信号)与slot(槽)机制
  • 40. 从QObject类,或者它的一个子类(比如QWidget类)所继承出的所有类,都可以包含signal和slot。 当对象的内部状态发生改变,signal被发送,只有定义了一个信号的类和它的子类才能发射这个信号;slot用来接收信号,但它们同时也是对象中正常的成员函数,可以被正常调用。 如果几个slot被连接到一个signal,当信号被发射时,这些slots就会被按任意顺序一个接一个地执行。 public slots:包含了任何信号都可以相连的slots。 protected slots:包含了该类和它的子类的信号才能连接的slots。就是说这些slots只是类的实现的一部分,而不是它和外界的接口。 private slots:包含了只有该类本身的信号可以连接的slots。就是说这个类非常紧密,甚至它的子类都没有获得连接该类中slots的权利。 Qt中signal(信号)与slot(槽)机制
  • 41. 谢谢!