Qt嵌入式图形开发(入门篇).pdf

5星(超过95%的资源)
所需积分/C币:49 2011-11-18 00:54:14 2.94MB PDF
4
收藏 收藏
举报

Qt嵌入式图形开发(入门篇).pdf Qt 是Trolltech 公司的一个标志性产品。Trolltech 公司1994 年成立于挪威,但 是公司的核心开发团队已经在1992 年开始了Qt 产品的研发,并于1995 年推出了Qt 的 第一个商业版,直到现在Qt 已经被世界各地的跨平台软件开发人员使用,而Qt 的功能 也得到了不断的完善和提高。 Qt 是一个支持多操作系统平台的应用程序开发框架,它的开发语言是C++。Qt 最 初主要是为跨平台的软件开发者提供统一的,精美的图形用户编程接口,但是现在它也 提供了统一的网络和数据库操作的编程接口。正如微软当年为操作系统提供了友好,精 致的用户界面一
no- openg l或-no-xfs,可以键入./ configure-help来狄得一些帮助信息。 二、认识Qt/ Embedded开发环境 Qt/ Embedded的开发环境可以取代那出我们激和的U和WMO开发工具。它提供了几个跨平台的 工尽使得开发变得速和方便,尤放是它的图形设计器。x下的开发者订以在PC机或者工作站使们虚 拟缓冲,从而可以仿真一个和底入式设备的显示终端大小,象素相同的显示环境 嵌入式设备的应用可以在安装了一个跨平台开发工具链的不同的平台上编泽。最通 常的做法是在一个UNIX系统上安装跨平台的带有1ibc库的GNUc++编译器和二进制工具 在开发的许多阶段,一个可替代的做法是使用Q的桌面版本,例如QL/Ⅹ11或是 Qt/ Windows来进行开发。这样开发人员就可以使用他们熟悉的开发环境,例如微软的 Visual c++或者 Borland c+;在UNlX操作系统下,许多环境也是可用的,例如 Kdevelop,它也支持交互式开发。 如果Qu/ Embedded的应用是在UNIX平台卜开发的话,那么它就可以在廾发的机器 上以一个独立的控制台或者虚拟缓冲帧的方式来运行,对于后者来说,其实是有一个X11 的应用程序虚拟了一个缓冲帧。通过指定显示设备的宽度,高度和颜色深度,虚拟出来 的缓冲帧将和物理的显示设备在每个像索上保持一致。这样每次调试应用时开发人员就 不用总是刷新嵌入式设备的 FLASH存储空间,从而加速了应用的编译、链接和运行周期 运行Qt的虚拟缓冲帧工具的方法是:在 Linux的图形模式下运行命令 qvfb(回车) 当Qt嵌入式的应用程序要把显示结果输岀到虚拟缓冲咴时,我们在命令行运行这 个程序时,在程序名后加上-qws的选项。例如:$> hello-qws 2.1QT的支撑工具 Qt包含了许多支持嵌入式系统开发的工具,其中一些工具我们会在别的地方介绍。 有两个最实用的工具(除了上面我们提到的虚拟缓冲帧)是 qmake和 Qt designer(图 形设计器)。 gmake是一个为编译Qt/ Embedded厍和应用而提供的 Makefile生成器。它能够根据 个工程文件(.pro)产生不同平台下的 Makefile文件。 qmake支持跨平台开发和影子 生成( shadow builds),影子牛成是指当工程的源代码共享给网终上的多台机器时,每 台机器编译链接这个工程的代码将在不同的子路径下完成,这样就不会覆盖别人的编译 链接生成的文件。 gmake还易于在不同的配置之间切换。 开发者可以使用Qt图形设计器可视化地设计对话框而不需编写一行代码。使用Qt 图形设计器的布局管理可以生成具有平滑改变尺寸的对话框, gmake和Qt图形设计器是 完全集成在一起的。 2.2信号与插槽 信号与插槽机制提供了对象间的通信机制,它易于理解和使用,并完全被Qt图形 设计器所支持。 图形用户接口的应用需要对用户的动作做出响应。例如,当用户点击了一个菜单项 或是工具栏的按钮时,应用程序会执行某些代码。大部分情况下,我们希望不同类型的 对象之间能够进行通信。程序员必须把事件和相关代码联系起来,这样才能对事仆做出 响应。以前的工具开发包使用的事件响应机制是易崩溃的,不够健壮的,同时也不是面 向对象的。 Trolltech L经创立了一种新的机制,叫做“信号与插槽”。信号与插槽是一 种强有力的对象间通信机制,它完全可以取代原始的冋调和消息映射机制;信号与插槽 是迅速的,类型安仝的,健壮的,完全面向对象并用C+来实现的一种机制。 在以前,当我们使用回调函数机制来把某段响应代码和一个按钮的动作相关联时 我们通常把那段响应代码写成一个函数,然后把这个函数的地址指针传给按钮,当那个 按钮被按下时,这个函数就会被执行。对于这种方式,以前的开发包不能够确俣国调两 数被执行时所传递进来的函数参数就是正确的类型,因此容易造成进程崩溃,另外一个 问题是,回调这种方式紧紧的绑定了图形用户接口的功能元素,因而很难把开发迂行独 立的分类。 Qt的信号与插槽机制是不同的。Qt的窗口在事件发生后会激发信号。例如一个按钮 被点击时会激发一个“ clicked”信号。程序员通过建立一个函数(称作一个插槽), 对象1 connect(对象1,信号1,对象2,插槽1) connect(对象1,信号1,对象2,插槽2) 信号1 信号2 对象2 信号1 插槽1 插槽2 对象3 信号1 connect(对象1,信号2,对象4,插槽1) 对象4 插棰1 插槽1 插槽2 插槽 connec(对象3,信号1,对象4,插槽3) 图 些信弓与插槽连接的拍象图 然后调用 connec t(函数把这个插槽和一个信号连接起来,这样就完成了一个事件和响 应代码的连接。信号与插槽机制并不要求类之间互相知道细节,这样就可以相对容易的 开发出代码可高重用的类。信号与插槽机制是类型妄全的,它以警告的方式报告类型错 误,巾不会使系统产生崩溃。 例如,如果一个退出按钮的 clicked(信号被连接到了一个应用的退出函数 quit()插槽。那么一个用户点击退出键将使应用程序终止运行。上述的连接过程用代 码写出来就是这样 connect( button, SIGNAL (clicked(), gApp, sLoT (quitO)) 我们可以在应用程序的执行过程中增加或是减少信号与插槽的连接。 信号与插槽的实现扩展了C++的语法,同吋也完全利用了C++面向对象的特征。信号 与插槽可以被重载或者重新实现,它们可以定义为类的公有,私有或是保护成员。 2.2.1信号与插槽的例子 如果一个类要使用信号与插槽机制,它就必须是从 QOb ject或者 QOb ject的子类继承,而 且在类的定义中必须加上Q0 BJECT宏。信号被定义在类的信号部分,而插槽则定义在 public slots, protected slots或者 private slots部分。 下面定义一个使用到信号与插槽机制的类 class bankAccount public QObject Q OBJECT public BankAccount(i curBalance-0 int balance( const f return curBalance: public slots void setBalance( int newBalance signals void balanceChanged( int newBalance private int unbAlance 和大部分的C+的类一样, Bankaccount类有一个构造函数,还有一个取值的函数 balance(),一个设置值的函数 setBalance( int newBalance)。 这个类有一个信号 balance changed0,这个信号声明了它在 Bankaccount类的成员 unbalance的值被改变时产生。信号不需要被实现,当信号被激发时,和该信号连接的插槽 将被执行 上面用来改置值的函数 setBalance( int newBalance)定义在类的“ public slots” 部分,因此它是个插槽。插槽是个需要实现的标准的成员函数,它可以像其它函数·样 破调用,也可以和信号相连接。 下面就是该插槽函数 setBalance( int newBalance)的实现代码: void BankAccount: setBalance( int newBalance if( newBalance !=curBalance curBalance newbalance emit balance Changed( curBalance 其中的一段代码 emit balance Changed( curBal ance 它的作用是当 unbAlance的值被改变后,将新的 unbalance的值作为参数去激活 balance Changed()信号。对于关键词“emit”,它和信号、插糟一烊是由Qt提供的,这 些关键词都会被c++的预处理机制转换为c十十代码 个对象的信号可以被多个不同的插槽连接,而多个信号也可以破连接到相同的插槽。 当信号和插慒被连接起来时,应当确保它们的参数类型是相同的,如果插槽的参数个数小于 和它连接在一起的信号的参数个数,那么从信号传递插槽的多余的参数将被忽略。 2.2.2元对象编译器 信号与插槽机制是以纯C艹+代码来实现的,实现的过程使用到了Qt开发工具包提供的 预处理器和元对象编译器(moc)。 moc读取应用程序的头文件,并产生支持信号与插槽的必要的代码。开发者没必要编辑 或是浏览这些自动产生的代码,当有需要时, gmake生成的 Makefile文件里会显式的包含 了运行moc的规则。 除了可以处理信号与插槽柷制之外,moc还攴持翻译机制,属性系统和运行时的信息 2.3窗体 Qt拥有丰富的满足不同需求的窗体(按钮,滚动条等等),Qt的窗体使用起来很灵 活,为了满足特别的要求,它很容易就可以被子类化。 窗体是 Qwidget类或它子类的实例,客户自己的窗体类需要从 Qwidget它的子类继 QObje TImer QWidget DIalog FRame QSpin Box QLabel QLineedit 图二摘录的 Widget类的继图 个窗体可以包含任意数量的子窗体,子窗体可以显示在父窗体的客户区,一个没 父窗体的窗体我们称之为顶级窗体(一个“窗口”),一个窗体通常有一个边框和标题 作为装饰。QL并未对一个窗体有什么限制,任何类型的窗体可以是顶级窗体,任何类型 的窗体可以是别的窗体的了窗体。在父窗伓显示区域的子窗体的位置可以通过布局管理 自动的进行设置,也可以人为的指定。当父窗体无效,隐藏或被删除后,它的子窗体都 会进行同样的动作 标签,消息,工具栏等等等,并未被限訇使用什么颜色,字体和语言。t的文本 呈现窗体可以使用HM子集显示一个多语言的宽文本。 2.3.1一个He1lo的例子 下面是一个显示“He1loQ/ Embedded!”的程序的完整的源代码: Helo CtEmbeddea? 图三Hel1oQt/ Embedded #include gapplication. h> #include <qlabel. h int main( int argc, char **argv QApplication app( argc, argy QLabel为 hell new QLabel( <font color=blue>Helle <i>Qt/Embedded!/i>/font>,0) app. setMain Widget( hello hello->showo return app. exec( 2.3.2通用窗体 下面是一些主要的Q窗体的截屏图,这些窗体使用了窗口样式。 el Push button 图四使用了 QHBox进行排列一个标签和一个按钮 @Button Group c Radio 1 Check 1 C Radio 2 Check 2 佟五使用 Qbutton Group的两个单选框和两个复选框 QGruuDB 195-05-7司03148司 oiineedt QTexterlit eVerything shouid akways Rossie, Eut no sstrpier. A的时2 cGr0xt过 寳六使用了 QgroupBox进行排列的的日期类ω Datetimeed it,一个行编辑框类 WLineedi,一个文本编辑类 TExtedit和一个组合框类 ComboBox 64% 陈4」 七以Qri排列的一个 QDial,一个 QProgressBar,一个 QSpinBox,一个 QScrollBar,一个 QLCDNumber 和一个QS1i Calumn 2 column 3 三队ve B12 one 早 i-0item 3 Three Trois c03 Q sem 4 F Quette 了ex5 Five Ea Six WIese 1 QTableltem @check Tableltem @comboTablelter WHe 2 0 厂 Check1 怒例 1Q块2厂C和20m2 2m3 Fc数k3 131e4 r Check 4 :a4 图八以Grid排列的一个 aIconView,一个Q. listview,一个 listbox和一个 TAble 有些时候在进行字符输入时,我们希望输入的字符满足了某种规则才能使输入被确认 Qt提供了解决的办法,例如 COmbobox, QLineedit和 QspinBox的字符输入可以通过 Validator的子类米进行约束和有效性检査。 通过继 QScrollview, QTable, LIstview, TExtedit和其它窗体就能够显示大量 的数据,并且自动的拥有了一个滚动条 许多卟t创建的窗体能够显示图像,例如按钮,标签,来单项等等。 Qimage类支持几种图 形格式的输入、输出和操作,它日前支持的图形格式有BΦP,GIF*,JPEG,MNVG,PNG,PNM,XBM 和XPM 2.3.3画布 Canvas类提供了一个高级的平面图形编程接口,它可以处理人量的像线条、矩形、椭 圆、文本、位图、动曲等这些画布项,画布项可以较容易的做成交互式的(例如做成支持用 户移动的)。 画布项是 Qcanvasltem了类的实例,它们比窗体类 Qwidget更显得轻量级,它们能够被快 速的移动,隐藏和显示。 Qcanvas可以更有效的支持冲突检测,它能够列出一个指定区域里 面的所有的画布项。 QcanvasItem可以被子类化,从而可以提供更多的客户画布项类型,或 者扩展已有的画布项的功能。 Qcanvas对象是由 Qcanvasvicw进行绘制的, Qcanvasview对象可以以不同的译文、比例、 旋转角度,剪切方式去显示同·个画布。 canvas对象是理想的数据表现方式,它已经被消费者用于绘制地图和显示网络拓扑结 构。它也可用于制作快节奏的且有大量角色的平面游戏。 5出Leve彐 Sh ps 2 2宮日g日Fem 图九在 Qtopia中用 QCanvas实现的小行星游戏 2.3.4客户窗体 通过对 Qwidget或者它的子类进行子类化,我们可以建立自己的客户窗体或者对话框。下面 是一个完整的源代码例子,它小例了如何通过子类化窗体,绘制一个模拟的时钟。 AnalogClock窗体类是 Qwidget的子类,它显示当前时间,并且可以自动地更新时间 图十模拟钟窗体 在 analogclock.h头文件中, AnalogClock以这样地形式定义 #include widget. h class AnalogClock public QWidget pub 11C AnalogClock( QWidget *parent =0, const char *name =0 protected: virtual void timerEvent( QTimerEvent event virtual void paintEvent( QPaintEvent *event AnalogClock类继承了 Qwidget,它有一个典型的窗体类构造涵数,这个函数有父窗口对象 指针和名字指针两个参数。(如果设置了名字的话,测试和调试起来就会容易些) timerevent()函数是从 Object( Qwidget的父类)对象继承而来的,这个函数会被系统定 期调用。 paintEvent(函数是从 QWidget继承而米的并且当窗体需要重画时这个函数就会 被调用。 timerevent(和 paintEvent(函数是“事件句柄”的两个例子。应用对象以 重载父类对象的虚拟函数 events( QEvent objects)的形式接收系统的事件。大约有超过50 个的系统事件是较常用的,例如 MouseButtonpress, MouseButtonrelease, Keypress, Keyrelease, Paint, Resize和 Close.对象可以对发给它们的事件倣岀响应或 者筛选一些事件后再发送给别的对象 analogclock.cpp文件是定义在 analogclock.h中的函数的实现源文件 #include <datetime. h> #inc lude <painter. h> #include analogclock h AnalogClock:: AnalogClock( QWidget *parent, const char *name QWidget( parent, name startTimer( 12000 resize(100,100) void AnalagClock:timerEvent( QTimerEvent * update o void AnalogClock:: paintEvent( QPaintEvent QCooRD hourhand8]={2,0,0,2,-2,0,0,-25 QCOORD minutehand[8={1,0,0,1,-1,0,0,-40}; QTime time=QTime:: currentlime o QPainter painter( this painter. set Window (-50,-50, 100, 100) painter. setBrush( black for int i-0: i< 12: i++)

...展开详情
试读 23P Qt嵌入式图形开发(入门篇).pdf
立即下载
限时抽奖 低至0.43元/次
身份认证后 购VIP低至7折
一个资源只可评论一次,评论内容不能少于5个字
惰鱼 还行,新手镇需要各种资料!
2014-08-08
回复
maxiao001 非常好哦,有点模糊了
2012-10-01
回复
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
  • 分享王者

关注 私信
上传资源赚钱or赚积分
最新推荐
Qt嵌入式图形开发(入门篇).pdf 49积分/C币 立即下载
1/23
Qt嵌入式图形开发(入门篇).pdf第1页
Qt嵌入式图形开发(入门篇).pdf第2页
Qt嵌入式图形开发(入门篇).pdf第3页
Qt嵌入式图形开发(入门篇).pdf第4页
Qt嵌入式图形开发(入门篇).pdf第5页

试读结束, 可继续读2页

49积分/C币 立即下载