《第10章 Linux编程—图形界面设计.pdf》由会员分享,可在线阅读,更多相关《第10章 Linux编程—图形界面设计.pdf(36页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、LinuxLinux操作系统操作系统操作系统操作系统 大工软件学院嵌入式系大工软件学院嵌入式系邱铁邱铁办公楼办公楼409Tel:87571521E_mail:第10章Linux图形界面设计工程实践的目的与任务工程实践的目的与任务了解Linux X Windows,及QT信号机制。熟悉QT编程,实现如图1所示单位转换工具并可以熟练利用QT Designer设计图形界面应用程序。X窗口是一种用于UNIX系统的标准图形化用户界面(GUI),它是由麻省理工学院开发的。GUI是用鼠标器和键盘控制的,具有下拉菜单、在屏按钮、卷动条和为运行不同应用的重叠窗口界面。X窗口系统在位映射屏幕上的一个或多个窗口中运
2、行程序。用户可以在每个窗口同时在系统上运行多个程序,并且通过用鼠标器点击它们来在窗口之间进行交换。X服务器处理所有X客户的处理程序,以及通过消息传递系统和其它客户交互工作。X服务器控制整个本地环境,因而当访问存储器和其它系统资源时,程序间进行合作。QT编程 Qt是一个跨平台的C+图形用户界面库,由挪威TrollTech公司出品,目前包括Qt,基于Framebuffer的Qt Embedded,快速开发工具Qt Designer,国际化工具Qt Linguist等部分Qt支持所有Unix系统,当然也包括Linux,还支持 WinNT/Win2k,Win95/98 平台。Trolltech 公司在
3、1994 年成立,但是在1992年,成立Trolltech公司的那批程序员就已经开始设计Qt 了,Qt的第一个商业版本于1995年推出Qt具有下列优点:优良的跨平台特性:Qt支持下列操作系统:Microsoft Windows 95/98,Microsoft Windows NT,Linux,Solaris,SunOS,HP-UX,Digital UNIX(OSF/1,Tru64),Irix,FreeBSD,BSD/OS,SCO,AIX,OS390,QNX 等等。面向对象Qt 的良好封装机制使得 Qt 的模块化程度非常高,可重用性较好,对于用户开发来说是非常 方便的。Qt 提供了一种称为sig
4、nals/slots 的安全类型来替代 callback,这使得各个元件 之间的协同工作变得十分简单。丰富的 API Qt 包括多达 250 个以上的 C+类,还替供基于模板的 collections,serialization,file,I/O device,directory management,date/time 类。甚至还包括正则表达式的处理 功能。QT Designer Qt设计器是用来设计和实现用户界面并能够在多平台下使用的一种工具。Qt设计器可以使用户界面设计实验变得简单。在任何时候你可以要求所生成的代码去重建Qt设计器产生的用户界面文件,并可以根据你的喜好来改变你的设计。qm
5、ake qmake是Trolltech公司创建的用来为不同的平台和编译器书写Makefile的工具。手写Makefile是比较困难并且容易出错的,尤其是需要给不同的平台和编译器组合写几个Makefile。使用qmake,开发者创建一个简单的“项目”文件并且运行qmake生成适当的Makefile。QT信号与Slot机制 信号和槽机制是QT的核心机制,要精通QT编程就必须对信号和槽有所了解。信号和槽是一种高级接口,应用于对象之间的通信,它是QT的核心特性,也是QT区别于其它工具包的重要地方。信号和槽是QT自行定义的一种通信机制,它独立于标准的C/C+语言,因此要正确的处理信号和槽,必须借助一个称
6、为moc(Meta Object Compiler)的QT工具,该工具是一个C+预处理程序,它为高层次的事件处理自动生成所需要的附加代码。在QT中信号和槽取代了这些凌乱的函数指针,使得我们编写这些通信程序更为简洁明了。信号和槽能携带任意数量和任意类型的参数,他们是类型完全安全的,不会像回调函数那样产生core dumps。信号 当某个信号对其客户或所有者发生的内部状态发生改变,信号被一个对象发射。只有定义过这个信号的类及其派生类能够发射这个信号。当一个信号被发射时,与其相关联的槽将被立刻执行,就象一个正常的函数调用一样。信号-槽机制完全独立于任何GUI事件循环。只有当所有的槽返回以后发射函数(
7、emit)才返回。如果存在多个槽与某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地执行,但是它们执行的顺序将会是随机的下面定义了三个信号:signals:void mySignal();void mySignal(int x);void mySignalParam(int x,int y);在上面的定义中,signals是QT的关键字,而非C/C+的。接下来的一行void mySignal()定义了信号mySignal,这个信号没有携带参数;接下来的一行void mySignal(int x)定义 了重名信号mySignal,但是它携带一个整形参数,这有点类似于C+中的虚函数。
8、从形式上 讲信号的声明与普通的C+函数是一样的,但是信号却没有函数体定义,另外,信号的返回 类型都是void,不要指望能从信号返回什么有用信息。信号由moc自动产生,它们不应该在.cpp文件中实现。槽 槽是普通的C+成员函数,可以被正常调用,它们唯一的特殊性就是很多信号可以与其相关联。当与其关联的信号被发射时,这个槽就会被调用。槽可以有参数,但槽的参数不能有缺省值。槽函数也分为三种类型,即public slots、private slots和protected slots。public slots:在这个区内声明的槽意味着任何对象都可将信号与之相连接。这对于组件编程非常有用,你可以创建彼此互不
9、了解的对象,将它们的信号与槽进行连接以便信息能够正确的传递。protected slots:在这个区内声明的槽意味着当前类及其子类可以将信号与之相连接。这适用于那些槽,它们是类实现的一部分,但是其界面接口却面向外部。private slots:在这个区内声明的槽意味着只有类自己可以将信号与之相连接。这适用于联系非常紧密的类。下面声明了三个槽public slots:void mySlot();void mySlot(int x);void mySignalParam(int x,int y);信号与槽的关联 通过调用QObject对象的connect函数来将某个对象的信号与另外一个对象的槽函数
10、相关联,这样当发射者发射信号时,接收者的槽函数将被调用。该函数的定义如下:bool QObject:connect(const QObject*sender,const char*signal,const QObject*receiver,const char*member)static创建工程目录打开QT Designer#su#mkdir convertor#cd convertor#designer&QT Designer 新建工程 选择FileNew菜单项,选择C+Project,创建新的工程,绘制窗体控件Name说明LineEditleEnterNumber输入待转换数字文本框Com
11、boBoxcbConvertFrom源转换单位ComboBoxcbConvertTo目标转换单位LineEditleResult转换结果SpinBoxsbDecimals转换结果的小数位数PushButtonpbClear清楚PushButtonpbCalculate开始转换PushButtonpbQuit退出向组合框(Combo Box)添加选项 右击cbConvertFrom和cbConvertTo,选择Edit,如图11.7所示。添加要转换的单位。对cbConvertFrom添加KiloMeters、Meters、CentiMeters、MilliMeters,对cbConvertTo添加Miles、Yards、Feet、Inches。编写代码 添加槽处理函数 添加信号-槽的映射:编辑Convert函数 为项目添加主cpp文件生成Makefile 在终端中使用qmake命令生成Makefile文件。编译运行编译运行 在终端中,运行make命令编译程序,程序编译后,可以发现在项目目录中多了一个可执行文件convertor。结果 在终端中运行./convertor命令,启动程序。
限制150内