linux 图形化程序设计

36
Linux 图图图图图图图 图图图图 图图 :宋 图图图 图图

Upload: powa

Post on 27-Jan-2016

63 views

Category:

Documents


3 download

DESCRIPTION

Linux 图形化程序设计. 任课教师:宋健健 主讲人:刘曦. 主要内容. 1.X window 系统介绍 2.Gnome/Gtk+ 程序设计 3.Kde/Qt 程序设计. X 的由来. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Linux 图形化程序设计

Linux 图形化程序设计

任课教师:宋健健主讲人:刘曦

Page 2: Linux 图形化程序设计

主要内容• 1.X window 系统介绍

• 2.Gnome/Gtk+ 程序设计

• 3.Kde/Qt 程序设计

Page 3: Linux 图形化程序设计

X 的由来• X Window 于 1984 年在麻省理工学院( MIT )

电脑科学研究室开始开发的,当时 Bob Scheifler正在发展分步式系统( distributed system ),同一时间 DEC 公司的 Jim Gettys 正在麻省理工学院做 Athena 计划的一部分。两个计划都需要一个相同的东西——一套在 UNIX 机器上运行优良的视窗系统。因此合作关系开始展开,他们从斯坦福( Stanford )大学得到了一套叫做W的实验性视窗系统。因为是根据W视窗系统的基础开始发展的,当发展到了足以和原先系统有明显区别时,他们把这个新系统叫做X。

Page 4: Linux 图形化程序设计

X window 系统的概念• 1. X window 系统

X window 系统是建于客户-服务器联结基础上的图形子系统。

X window 系统独立于系统内核。• 2. X 服务器和客户端

X 服务器是一个运行在本地计算机上的程序。它响应来自 X 客户程序的请求,在屏幕上画图或者读取键盘或鼠标的输入,并将它传给客户端。

X 客户端是一个用诸如 Xlib, Xt 的库写成的运用 X 协议的应用程序。它通过向负责管理自己的 X 服务器提出对显示和输出资源的请求来使用其他计算机的这些资源。

Page 5: Linux 图形化程序设计

X window 系统的概念 (2)

• 3. X 协议X 协议定义了客户-服务器中应用程

序和它的显示的联系。通过这个协议,应用与它的显示被分离开来。

Page 6: Linux 图形化程序设计

window 系统的概念 (3)

• 4. Xlib 库Xlib 库是一个 C 语言库,它为 X 协议里的

信息交换提供了一个 API 。• 5. X 工具包

将常用的素材(如按钮,菜单等)收集到一起就形成了所谓的 X 工具包 (X ToolKit)

• 6. X 窗口管理器 X 窗口管理器负责安排客户窗口在显示屏幕上的摆放位置,并完成移动窗口和调整窗口尺寸等管理性的工作。

Page 7: Linux 图形化程序设计

Gnome, X和窗口管理器• 新用户对 Gnome理解比较困难的一个地方是 Gnome和窗口管理器的关系以及 Gnome和 X的关系。要理解这些关系,就必须分解这3个组件。

• X窗口系统支持在屏幕上画出图形组件。它是整个系统的基础,提供了所有库函数和支持图形显示的技术。窗口管理器是定义窗口显示方法的软件。

• Gnome是一个桌面环境,它运行在 X窗口系统和窗口管理器之上。 Gnome的设计使它不依赖于任何一个窗口管理器。用户可以任意选择他喜欢的窗口管理器。

Page 8: Linux 图形化程序设计

X window 系统的概念 (4)

Page 9: Linux 图形化程序设计
Page 10: Linux 图形化程序设计

X Window 特征 • 综合前面所述,我们知道 X 的设计理念是: • 计算分布

• 设备分离

• 协议独立

Page 11: Linux 图形化程序设计

X Window 特征( 2 )• 这样设计带来的好处是: • 不论是本地还是网络上的计算,对用户和开发者其 look-an

d-feel 来说都是一样的;• X Window System 不是操作系统的一部分,而仅仅是一个

应用,易于开发、维护、移植;• X Server 是高度可移植的,支持各种语言和操作系统;• X Client也是高度可移植的;• X支持任何面向字节流的网络协议不论是本地还是远程的;• 应用的计算是分布的,性能不受约束。• X Application 的设计是高度灵活的,只需实现核心功能。• X Window System 从设计开始时就融入了面向对象的设计

理念,大的窗口由小的窗口组成 (Widget) 。符合软件设计的准则,大大方便了 X 应用的开发。

Page 12: Linux 图形化程序设计

X 程序的流程 • 1. 取得命令行参数;

2. 与用户的显示器建立连接;3. 加载资源;4. 按照资源文件设置字体和色彩;5. 决定顶级窗口的位置和大小;6. 生成顶级窗口;7. 设置 wm属性,告知 wm 它希望的大小和位置;

8. 为顶级窗口生成图形上下文 (graphics context :包含字体,前景背景色彩等信息 );

Page 13: Linux 图形化程序设计

X 程序的流程( 2 )• 9. 设置必须的窗口属性 ( 如 colormap 等 );

10.选择希望处理的事件;11.映射顶级窗口,这是它才真正显示出来;12.生成其它窗口,并保存它们的标志供以后访问;

13. 读取事件,解释并处理它;14.重复 13 ,直到收到退出事件;15.退出时,销毁顶级窗口,关闭与显示器的连接。

Page 14: Linux 图形化程序设计

Event Driven

• 应用一旦初始化完毕,即进入一个事件循环;• 事件循环是个无限循环,它不停地在事件队列中查看 X事件;

• 事件一般说来是由用户与显示器的交互产生的,也包括其它 X Client 发来的事件以及其它非 X 应用发来的事件;

• 如果事件队列中没有事件,它就继续循环;• 如果有事件,则调用相关函数来处理它;• X Client可以选择它希望响应的事件种类; • 如果退出循环,那么程序也就结束了。

Page 15: Linux 图形化程序设计

Linux桌面环境的发展• 1.Linux GUI产生的原因。

为了拥有更多的用户,占据一定的市场份额。

• 2.Linux GUI 的主要组成部分a. 窗口系统b. 窗口管理器: fvwm,twm,gwmc. 工具包 :Xt, Motif (商业) , Qt, GT

K+ 等d.风格

Page 16: Linux 图形化程序设计

Linux桌面环境的发展( 2 )• Linux 发展初期的图形接口

FVWM95AfterStep……

• 缺点:是其它操作系统的仿制品,不能提供优秀操作系统所需要的特性。

Page 17: Linux 图形化程序设计

Linux桌面环境的发展( 3 )• KDE 是 Linux 上第一个真正的桌面。开发 KDE 的

原因是当时 X下的桌面缺乏下列特征: 没有通用的 Drag&Drop 协议;没有基于对话框的桌面配置工具;没有一致的应用帮助系统;没有统一的应用开发平台;没有复合文档平台;在应用级没有网络透明性;在 X下写程序非常乏味。

Page 18: Linux 图形化程序设计

Linux桌面环境的发展( 4 )• KDE 的产生

K Desktop Evironment: K无特殊含义目的:提供一个开放源代码的图形用

户接口和开发环境。基于 Troll Technologies 公司的 Qt 库

的。 Qt 库是一个跨平台的 C++类库。但是 Qt 库不遵从 GPL 或 LGPL 协议。

Page 19: Linux 图形化程序设计

Linux桌面环境的发展( 5 )• KDE 给用户带来了下面的好处:

漂亮的桌面,一致的界面 (consistent look&feel);完全的网络透明性;集成的帮助系统,方便一致的访问;国际化 (25种语言 );集中的、对话框驱动的桌面配置;大量的 KDE 应用;

Page 20: Linux 图形化程序设计

KDE 程序设计( 3 )• KDE 由以下三大部分组成:

• KDE桌面环境 ( 包括WM);• KDE 应用开发平台;• KDE办公套件。

Page 21: Linux 图形化程序设计

KDE 程序设计( 4 )

Page 22: Linux 图形化程序设计

KDE 程序设计( 5 )• KDE 开发的特征 :

• KDE 是用 C++ 写成的,完全复合 OO 设计。由此带来的KDE组件的可重用性和高效率是 KDE 成功的关键。

KDE 提供给开发者的开发平台类似于微软的 MFC/COM/ActiveX( 对应于 QT/KOM/OpenParts) ,允许 RAD 和对现有组件及技术的充分利用。

KDE 应用都是生成一个 KApplication 对象实例,并从 KTopLevelWidget继承。这样开发的 KDE 应用自动地复合 KDE 的标准。

Page 23: Linux 图形化程序设计

KDE 程序设计( 6 )• 最简单的 Qt 应用程序• 见程序 Qt1.cpp

• 带消息处理的 Qt 应用程序• 见程序 Qt2.cpp

Page 24: Linux 图形化程序设计

• #include <qapplication.h>• #include <qpushbutton.h>• int main( int argc, char **argv )• {• //QApplication 负责应用程序的初始化、中止、流

程控制和进行应用程序的主要设置。• QApplication app( argc, argv );• QPushButton button("Hello world",0);• app.setMainWidget(&button);• button.show();• return app.exec();• }

Page 25: Linux 图形化程序设计

• #include <qapplication.h>• #include <qpushbutton.h>• int main( int argc, char **argv )• {• QApplication app( argc, argv );• QPushButton *button=new QPushButton( "Hel

lo world!", 0 );• hello->resize( 100, 30 );• QObject::connect(button, SIGNAL(clicked()),

&app, SLOT(quit()) );• app.setMainWidget(button);• butotn->show();• return app.exec();• }

Page 26: Linux 图形化程序设计

Linux桌面环境的发展( 6 )• Gnome 的产生

Gnome 的原动力就起源于对 KDE许可证问题的不满。

Gnome 使用的工具包是 GTK+ 。

GTK+ 是一个遵守 GPL 协议的开发工具包。没有 Qt 的那些限制。

Page 27: Linux 图形化程序设计

Gnome 程序开发• 1.什么是 Gnome?

Gnome (GNU Network Object Model Envirenment) 。

从用户的角度看,它是一个集成的桌面环境以及应用程序集合;

从开发人员的角度看,它是一个应用程序的基础开发结构。

Gnome 是底层 X 窗口系统和高层窗口管理器软件中间的一个程序设计界面

Page 28: Linux 图形化程序设计

Gnome 程序开发( 2 )• 2.Gnome 开发体系的基础结构

Gnome 的开发基础结构是围绕一组由ANSI C 语言写成的函数库的。

Gnome 中最基本的工具包是 GTK+ ( GIMP ToolKit ) ,它由两部分组成: GTK和 GDK ( GIMP Drawing Kit )。

GTK层为 C 语言提供了一个对象模型,并为 UI 工具包提供了最基本的 widget 。

GDK 是 Xlib 的一个底层包装。

Page 29: Linux 图形化程序设计

Gnome 程序开发( 3 )

Application

Gnome libs

GTK

GDK

Glib Xlib

Page 30: Linux 图形化程序设计

Gnome 程序开发( 4 )• Gnome 库在最高层,它包括帮助例程,类和特殊的 widg

et ,并为应用程序提供了一个基础框架。• 第二层是 GTK 库,它是 GTK+的一部分。这个库提供了

基本的工具包和 widget (如按钮,标签和输入框等)来创建 GUI 应用程序。大多数 GUI 是直接用 GTK编写的,它同时为 Gnome 库提供了一个功能强大的对象系统。

• 再下一层是 GDK ,它简单地对 X函数库进行了包装,只有在我们进行特殊绘画或者设置窗口的特殊属性的时候,我们才需要用到它。

• 最下面的一层是 Glib ,它是 C 的一个实用程序库,包括可移植性和一些实用程序功能,以及一些容器类,例如,链表,可变数组等有用结构。

Page 31: Linux 图形化程序设计

Gnome 程序开发( 5 )• 第一个例子程序。演示 Gnome 程序的主要框架。

• 见程序 gnome1.c 。演示

Page 32: Linux 图形化程序设计

#include <gnome.h>int main(int argc,char *argv[]){ GtkWidget *app; gnome_init ("example","0.1",argc,argv); app=gnome_app_new("example","Window Title"); gtk_widget_show(app); gtk_main(); return 0;}

Page 33: Linux 图形化程序设计

Gnome 程序开发( 6 )• 第二个例子程序。演示按钮素材的使用以及用户事件的处理(消息传递)。

• 见程序 gnome2.c

Page 34: Linux 图形化程序设计

#include <gtk/gtk.h>static void button_clicked(GtkWidget *button,const char *data){ g_print(data);}int main(int argc,char *argv[]){GtkWidget *app;GtkWidget *button;gtk_init(&argc,&argv); app=gtk_window_new(GTK_WINDOW_TOPLEVEL); button=gtk_button_new_with_label("Hello,\n GNOME world!"); gtk_signal_connect(GTK_OBJECT(app),"delete_event",GTK_SIGNAL_FUNC( gtk_main_quit),NULL); gtk_signal_connect(GTK_OBJECT(button),"clicked",GTK_SIGNAL_FUNC(button_clic ked),"Ouch!\n"); gtk_container_add(GTK_CONTAINER(app),button); gtk_widget_show_all(app); gtk_main();return 0;}

Page 35: Linux 图形化程序设计

Gnome 程序开发( 7 )• #define gtk_signal_connect(object,name,func,

func_data)Attaches a function pointer and user data to a signal for a particular object.The GtkSignalFunction takes a GtkObject as its first parameter. It will be the same object as the one you're connecting the hook to. The func_data will be passed as the last parameter to the hook.

Page 36: Linux 图形化程序设计

Gnome 程序开发( 8 )• gtk_signal_connect(object,name,func,func_data)• object : the object associated with the signal, e.g.

if a button is getting pressed, this is that button.• name : name of the signal.• func : function pointer to attach to the signal.• func_data : value to pass as to your function (thr

ough the marshaller).• Returns : the connection id.