1 / 36

Linux 图形化程序设计

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

hide
Download Presentation

Linux 图形化程序设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Linux图形化程序设计 任课教师:宋健健 主讲人:刘曦

  2. 主要内容 • 1.X window系统介绍 • 2.Gnome/Gtk+程序设计 • 3.Kde/Qt程序设计

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

  4. X window系统的概念 • 1. X window系统X window系统是建于客户-服务器联结基础上的图形子系统。X window系统独立于系统内核。 • 2. X服务器和客户端X服务器是一个运行在本地计算机上的程序。它响应来自X客户程序的请求,在屏幕上画图或者读取键盘或鼠标的输入,并将它传给客户端。X客户端是一个用诸如Xlib, Xt的库写成的运用X协议的应用程序。它通过向负责管理自己的X服务器提出对显示和输出资源的请求来使用其他计算机的这些资源。

  5. X window系统的概念(2) • 3. X协议X协议定义了客户-服务器中应用程序和它的显示的联系。通过这个协议,应用与它的显示被分离开来。

  6. window系统的概念(3) • 4. Xlib库Xlib库是一个C语言库,它为X协议里的信息交换提供了一个API。 • 5. X工具包 将常用的素材(如按钮,菜单等)收集到一起就形成了所谓的X工具包(X ToolKit) • 6. X窗口管理器X窗口管理器负责安排客户窗口在显示屏幕上的摆放位置,并完成移动窗口和调整窗口尺寸等管理性的工作。

  7. Gnome,X和窗口管理器 • 新用户对Gnome理解比较困难的一个地方是Gnome和窗口管理器的关系以及Gnome和X的关系。要理解这些关系,就必须分解这3个组件。 • X窗口系统支持在屏幕上画出图形组件。它是整个系统的基础,提供了所有库函数和支持图形显示的技术。窗口管理器是定义窗口显示方法的软件。 • Gnome是一个桌面环境,它运行在X窗口系统和窗口管理器之上。Gnome的设计使它不依赖于任何一个窗口管理器。用户可以任意选择他喜欢的窗口管理器。

  8. X window系统的概念(4)

  9. X Window特征 • 综合前面所述,我们知道X的设计理念是: • 计算分布 • 设备分离 • 协议独立

  10. X Window特征(2) • 这样设计带来的好处是: • 不论是本地还是网络上的计算,对用户和开发者其look-and-feel来说都是一样的; • X Window System不是操作系统的一部分,而仅仅是一个应用,易于开发、维护、移植; • X Server是高度可移植的,支持各种语言和操作系统; • X Client也是高度可移植的; • X支持任何面向字节流的网络协议不论是本地还是远程的; • 应用的计算是分布的,性能不受约束。 • X Application的设计是高度灵活的,只需实现核心功能。 • X Window System从设计开始时就融入了面向对象的设计理念,大的窗口由小的窗口组成(Widget)。符合软件设计的准则,大大方便了X应用的开发。

  11. X程序的流程 • 1. 取得命令行参数;2. 与用户的显示器建立连接;3. 加载资源;4. 按照资源文件设置字体和色彩;5. 决定顶级窗口的位置和大小;6. 生成顶级窗口;7. 设置wm属性,告知wm它希望的大小和位置;8. 为顶级窗口生成图形上下文(graphics context:包含字体,前景背景色彩等信息);

  12. X程序的流程(2) • 9. 设置必须的窗口属性(如colormap等);10.选择希望处理的事件;11.映射顶级窗口,这是它才真正显示出来;12.生成其它窗口,并保存它们的标志供以后访问;13.读取事件,解释并处理它;14.重复13,直到收到退出事件;15.退出时,销毁顶级窗口,关闭与显示器的连接。

  13. Event Driven • 应用一旦初始化完毕,即进入一个事件循环; • 事件循环是个无限循环,它不停地在事件队列中查看X事件; • 事件一般说来是由用户与显示器的交互产生的,也包括其它X Client发来的事件以及其它非X应用发来的事件; • 如果事件队列中没有事件,它就继续循环; • 如果有事件,则调用相关函数来处理它; • X Client可以选择它希望响应的事件种类; • 如果退出循环,那么程序也就结束了。

  14. Linux桌面环境的发展 • 1.Linux GUI产生的原因。 为了拥有更多的用户,占据一定的市场份额。 • 2.Linux GUI的主要组成部分a.窗口系统b.窗口管理器:fvwm,twm,gwm c.工具包:Xt, Motif(商业), Qt, GTK+等d.风格

  15. Linux桌面环境的发展(2) • Linux发展初期的图形接口FVWM95 AfterStep …… • 缺点:是其它操作系统的仿制品,不能提供优秀操作系统所需要的特性。

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

  17. Linux桌面环境的发展(4) • KDE的产生K Desktop Evironment: K无特殊含义 目的:提供一个开放源代码的图形用户接口和开发环境。 基于Troll Technologies公司的Qt库的。Qt库是一个跨平台的C++类库。 但是Qt库不遵从GPL或LGPL协议。

  18. Linux桌面环境的发展(5) • KDE给用户带来了下面的好处: 漂亮的桌面,一致的界面(consistent look&feel); 完全的网络透明性; 集成的帮助系统,方便一致的访问; 国际化(25种语言); 集中的、对话框驱动的桌面配置; 大量的KDE应用;

  19. KDE程序设计(3) • KDE由以下三大部分组成: • KDE桌面环境(包括WM); • KDE应用开发平台; • KDE办公套件。

  20. KDE程序设计(4)

  21. KDE程序设计(5) • KDE开发的特征 : • KDE是用C++写成的,完全复合OO设计。由此带来的KDE组件的可重用性和高效率是KDE成功的关键。 KDE提供给开发者的开发平台类似于微软的MFC/COM/ActiveX(对应于QT/KOM/OpenParts),允许RAD和对现有组件及技术的充分利用。 KDE应用都是生成一个KApplication对象实例,并从KTopLevelWidget继承。这样开发的KDE应用自动地复合KDE的标准。

  22. KDE程序设计(6) • 最简单的Qt应用程序 • 见程序Qt1.cpp • 带消息处理的Qt应用程序 • 见程序Qt2.cpp

  23. #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(); • }

  24. #include <qapplication.h> • #include <qpushbutton.h> • int main( int argc, char **argv ) • { • QApplication app( argc, argv ); • QPushButton *button=new QPushButton( "Hello world!", 0 ); • hello->resize( 100, 30 ); • QObject::connect(button, SIGNAL(clicked()), &app, SLOT(quit()) ); • app.setMainWidget(button); • butotn->show(); • return app.exec(); • }

  25. Linux桌面环境的发展(6) • Gnome的产生Gnome的原动力就起源于对KDE许可证问题的不满。Gnome使用的工具包是GTK+。GTK+是一个遵守GPL协议的开发工具包。没有Qt的那些限制。

  26. Gnome程序开发 • 1.什么是Gnome?Gnome (GNU Network Object Model Envirenment)。 从用户的角度看,它是一个集成的桌面环境以及应用程序集合; 从开发人员的角度看,它是一个应用程序的基础开发结构。Gnome是底层X窗口系统和高层窗口管理器软件中间的一个程序设计界面

  27. Gnome程序开发(2) • 2.Gnome开发体系的基础结构Gnome的开发基础结构是围绕一组由ANSI C语言写成的函数库的。Gnome中最基本的工具包是GTK+ ( GIMP ToolKit ),它由两部分组成:GTK和GDK(GIMP Drawing Kit)。GTK层为C语言提供了一个对象模型,并为UI工具包提供了最基本的widget。GDK是Xlib的一个底层包装。

  28. Gnome程序开发(3) Application Gnome libs GTK GDK Glib Xlib

  29. Gnome程序开发(4) • Gnome库在最高层,它包括帮助例程,类和特殊的widget,并为应用程序提供了一个基础框架。 • 第二层是GTK库,它是GTK+的一部分。这个库提供了基本的工具包和widget(如按钮,标签和输入框等)来创建GUI应用程序。大多数GUI是直接用GTK编写的,它同时为Gnome库提供了一个功能强大的对象系统。 • 再下一层是GDK,它简单地对X函数库进行了包装,只有在我们进行特殊绘画或者设置窗口的特殊属性的时候,我们才需要用到它。 • 最下面的一层是Glib,它是C的一个实用程序库,包括可移植性和一些实用程序功能,以及一些容器类,例如,链表,可变数组等有用结构。

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

  31. #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; }

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

  33. #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; }

  34. 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.

  35. 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 (through the marshaller). • Returns : the connection id.

More Related