?? gdb和gtk
字號:
ubuntu8.04配置GCC/GDB等C/C++開發工具 本系列教程版權歸集思博客所有,請注明出處:集思博客www.gisblogs.net在Ubuntu發行版中,打開shell,使用下面的命令可以方便的安裝GCC編譯器(\$為命令行提示符):$ sudo apt-get install build-essential該命令可以把所需要gcc、g++編譯器和make工具及其依賴的其它軟件包自動安裝并配置好。 $ sudo apt-get install g77 f77 gfortran該命令可以把Fortran 77編譯器及Fortran95編譯器及其依賴的軟件包自動安裝并配置好。 $ sudo apt-get install gdb該命令可以把gdb調試器及其依賴的軟件包自動安裝并配置好,gdb是Linux下的默認調試工具。 安裝完成后寫一個C語言程序testc.c測試一下。 #include <stdio.h>int main(){printf("Hello Ubuntu!\n");return 0;}$ gcc testc.c -o testc$ ./testc 2、安裝GTK環境安裝GTK環境只要安裝一個gnome-core-devel就可以了,里面集成了很多其他的包。除此之外還要轉一些其他的東西,如libglib2.0 -doc、libgtk2.0-doc幫助文檔,devhelp幫助文檔查看,glade-gnome、glade-common、glade-doc圖形界面設計等。 sudo apt-get install gnome-core-develsudo apt-get install libglib2.0-doc libgtk2.0-docsudo apt-get install devhelpsudo apt-get install glade-gnome glade-common glade-doc 3、測試程序 本系列教程版權歸集思博客所有,請注明出處:集思博客www.gisblogs.net #include<stdio.h>#include <gtk/gtk.h> void hello(GtkWidget *widget,gpointer data){g_print("Hello Ubuntu!\n");}gint delete_event(GtkWidget *widget,GdkEvent *event,gpointer data){g_print ("delete event occurred\n");return(TRUE);}void destroy(GtkWidget *widget,gpointer data){gtk_main_quit();}int main( int argc, char *argv[] ){GtkWidget *window;GtkWidget *button;gtk_init (&argc, &argv);window=gtk_window_new (GTK_WINDOW_TOPLEVEL);gtk_signal_connect (GTK_OBJECT(window),"delete_event",GTK_SIGNAL_FUNC(delete_event),NULL);gtk_signal_connect (GTK_OBJECT (window), "destroy",GTK_SIGNAL_FUNC (destroy), NULL);gtk_container_set_border_width (GTK_CONTAINER (window), 10);button = gtk_button_new_with_label ("Hello Ubuntu!");gtk_signal_connect (GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC (hello), NULL);gtk_signal_connect_object (GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC (gtk_widget_destroy),GTK_OBJECT (window));gtk_container_add (GTK_CONTAINER (window), button);gtk_widget_show (button);gtk_widget_show (window);gtk_main();return(0);} 用下面命令編譯運行 $ gcc gtkhello.c -o gtktest `pkg-config --cflags --libs gtk+-2.0`$ ./gtktest 會顯示一個帶有一個按鈕的窗口,點擊按鈕以后窗口關閉,命令行顯示Hello Ubuntu! 4、QT安裝 libqt4-coreqt4-designerqt4-dev-toolsqt4-qtconfiglibqt4-devlibqt4-gui libqt4-debuglibqt4-sql 這個我還沒有怎么用過,在新立得里面搜索QT4,看著差不多的都裝上了。GNU Image Manipulation Program (GIMP)GTK (GIMP ToolKit) 原本只是 GIMP 開發過程中用來管理圖型界面的一套工具程序庫. 由于它使用 LGPL 聲明, 程序的開發者可以免費使用它來開發公共程序軟件, 免費軟件或甚至商用軟件. 隨者使用率及使用范圍的增大, 很快的 GTK 從只為了滿足 GIMP 需求而存在的印象中跳出, 發展成今日功能廣泛的一套程序庫.GTK 的穩定版已從 1.2 發行到現在的 2.0. 1.2 版基本上只有 GLIB 跟 GTK+ 兩個組件, 而 GTK 中另含有 GDK (GIMP Drawing Kit) 程序庫. 一般我們直接使用的是 GTK. 其中幾乎所有繪圖功能都是透過 GDK 來完成的. GDK 主要負責和 X Window 的程序庫做低層的溝通. 它也提供較為簡化的程序界面給 GTK 使用. glib 是最低層的程序庫. 它主要的功能是與系統上的 C library 打交道從而給予程序設計者一個一致的環境, 不需為了各個 UNIX 系統上的些許不同而顧慮. 2.0 除了修改 1.2 之外, 還增加了 ATK (Accessibility Tool Kit) 和 Pango (pan 希臘 "全部", go 日文 "語"). 透過 ATK 使得在開發幫助殘疾人士的工具軟件上,不論是在可行性還是在難易度上都有相當大的改善. Pango 的多國文字處理能力在全球化的今天更是一項不可或缺的功能. 此外專門處理圖形的 GDK-pixbuf 也合并到了 2.0 版的 GTK+ 套件中.GTK 有一項特點是它完全使用 C 語言, 但無論在設計上或是在應用上都一直有著OO的特點. 對象之間不但有繼承的特性, 更有回調函數 (callback function) 構成事件驅動的特點.GTK 的世界十分廣闊. 諸如 GNet 等使用 GLIB 建立的網絡公共程序庫, 雖然不是 GTK+ 小組制作但也有越來越多人在使用. 有興趣的網友們可以去 GTK 及 GNOME 的官方網站.GTK 編程基本示例●GTK 簡單編程下面的例子是一個GTK最基本例子,它僅僅在屏幕上彈出一個窗口,并且 即使關閉該窗口,該程序仍未退出。 /* File: base.c */ #include <gtk/gtk.h> int main( int argc, char *argv[] ) { GtkWidget *window; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_show (window); gtk_main (); return(0); } 其中 gtk_init(&argc, &argv) 是gtk應用程序的初始化部分,它使gtk 應用程序可以接受某些命令行的參量: --gtk-module //載入另外的GTK模塊 --g-fatal-warnings //使所有警告是致命錯誤 --gtk-debug //調試gtk --gtk-no-debug //不調試gtk --gdk-debug //調試gdk --gdk-no-debug //不調試gdk --display //指定display --sync //使X調用按順序方式 --no-xshm //不使用X共享內存 --name //指定窗口管理器使用的程序名 --class //指定窗口管理器使用的程序類型 其中 window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_show (window); 建立頂級窗口并且顯示該窗口,它在缺省情況下是200x200大小。最后 gtk_main() 使程序進入事件循環階段,gtk將在內部處理事件。現在讓我們編譯文件 base.c: gcc -Wall -g base.c -o base \ `gtk-config --cflags` `gtk-config --libs` 其中 `gtk-config --cflags` 產生編譯gtk所使用的頭文件位置, `gtk-config --libs` 產生連接gtk程序所使用的庫。一般地,涉及 gtk的庫有: libgtk.so libgdk.so libgmodule.so libglib.so。接下來把上面的例子變成一個稍微復雜的例子,該例子彈出一個 窗口,并且在窗口中顯示一個按鈕。/* File: helloworld.c */ #include <gtk/gtk.h> void hello( GtkWidget *widget, gpointer data ) { g_print ("Hello World\n"); } gint delete_event( GtkWidget *widget, GdkEvent *event, gpointer data ) { //打印信息 g_print ("delete event occurred\n"); //如果返回FALSE,GTK將發出"destroy"信號; 如果返回TRUE, //則不讓該窗口關閉 return(TRUE); } void destroy( GtkWidget *widget, gpointer data ) { gtk_main_quit(); } int main( int argc, char *argv[] ) { //GtkWidget 是 Widget的類型 GtkWidget *window; GtkWidget *button; //gtk 初始化 gtk_init(&argc, &argv); //建立新窗口 window = gtk_window_new (GTK_WINDOW_TOPLEVEL); //當使用窗口管理器關閉窗口時,將調用 delete_event() 函數 //本例中所傳遞的參數是 NULL gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (delete_event), NULL); //把 "destroy" 事件和信號處理器聯系起來 gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (destroy), NULL); //設置窗口的邊界寬度 gtk_container_set_border_width (GTK_CONTAINER (window), 10); //建立一個標簽是"Hello World"的按鈕 button = gtk_button_new_with_label ("Hello World"); //當按鈕被單擊時,即接收到"clicked"信號,將調用 hello()函數 gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (hello), NULL); //當按鈕被單擊時,調用 gtk_widget_destroy(window)關閉窗口。 //這里將引發 "destroy" 信號 gtk_signal_connect_object (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), GTK_OBJECT (window)); //把按鈕加入頂級窗口中 gtk_container_add (GTK_CONTAINER (window), button); //顯示按鈕 gtk_widget_show (button); //顯示頂級窗口 gtk_widget_show (window); //進入事件循環 gtk_main (); return(0); } 編譯連接 helloworld.c,執行結果為:[ gtk-helloworld.gif ]下面總結一下,編寫GTK程序的基本步驟: * 初始化 * 創建主窗口 * 創建并加入子窗口 * 設置組件回調 * 顯示窗口 * 進入事件循環 ●GTK中文程序示例上面的例子是英文編程的基本例子,如果在程序中使用中文,還應當 對上面的例子作適當的修改。當然最基本的要求還是Linux系統必須有 一個正確的國際化環境,具體地說就是: * 系統支持中文C Locale * 系統支持中文X Locale * GTK的資源文件/etc/gtk/gtkrc.zh_CN設置正確 對于上面的幾個要求,可以參閱本書的國際化編程部分。下面是一個典型的 gtkrc.zh_CN文件,其中指定的缺省字體是14點陣 字體。 # $(gtkconfigdir)/gtkrc.zh_CN # # This file defines the fontsets for Chinese language (zh) using # the simplified chinese standard GuoBiao as in mainland China (CN) # # 1999, Pablo Saratxaga <srtxg@chanae.alphanet.ch> # style "gtk-default-zh-cn" { fontset = "-adobe-helvetica-medium-r-normal--14-*-*-*-*-*-iso8859-*,\ -cclib-song-medium-r-normal--14-*-*-*-*-*-gbk-0" } class "GtkWidget" style "gtk-default-zh-cn" 使上述程序支持中文非常簡單,只需要在初始化gtk之前調用locale設置函數: //設置Locale gtk_set_locale(); //gtk 初始化 gtk_init(&argc, &argv); 把按鈕的標簽改為中文即可: //建立一個含中文標簽的按鈕 button = gtk_button_new_with_label ("大家好!"); 程序運行的結果是:[ gtk-helloworld-chinese.gif ]如果不想用缺省的資源文件中所指定的字體,也可以在程序中指定 資源文件或直接把fontset寫在程序中。 指定資源文件使用函數 gtk_rc_parse(filename),直接使用fontset使用函數 gtk_rc_parse_string (gtkrc_string)。●實例詳細剖析上面的例子中,我們遇到了許多新的數據類型和回調的方式等,下面 一一剖析: * 包含的頭文件: 如果程序只涉及到gtk部分,而不是直接調用gdk的函數,只須包含 gtk/gtk.h,如涉及到gdk部分,應包含gdk/gdk.h * 數據類型: glib 中定義了許多數據類型如 gpointer,gint等等,它們都是比較 容易理解的。對GTK的組件(GtkWidget),類型都是GtkWidget,它包含了一個 窗口組件所需要的信息。GdkEvent 則封裝了X事件的信息。 * 信號和回調 信號(Signal)是GTK中出現的新的并且比較重要的概念。這里講的"信號" 不同于UNIX的signal,只是名稱一樣。當處理X事件時,如鼠標按鍵按下, GTK的組件接收到這一事件,便發出響應的信號。不同的組件相關信號 可能不一樣。 在上述例子中使用函數 gint gtk_signal_connect( GtkObject *object, gchar *name, GtkSignalFunc func, gpointer func_data ); 把組件 object 與回調函數 func 聯系起來,name 是所發出的信號的 名稱。func_data 是傳遞給回調函數的參數。回調函數的格式是 void callback_func( GtkWidget *widget, gpointer callback_data ); 其中 widget 是發出信號的組件,callback_data 是傳遞參數的指針。在上例中還使用了另外一套類似的函數: gint gtk_signal_connect_object( GtkObject *object, gchar *name, GtkSignalFunc func, GtkObject *slot_object ); void callback_func( GtkObject *object ); 它們與第一套函數的區別是回調函數只使用一個參量。 * GTK 的事件: gtk組件的行為或X服務器發送的事件可以和下列事件聯系起來 button_press_event //按鈕按下 button_release_event //按鈕釋放 motion_notify_event //鼠標移動 delete_event //使用窗口管理器關閉 destroy_event //關閉 expose_event //曝光 key_press_event //按鍵按下 key_release_event //按鍵釋放 enter_notify_event //鼠標指針進入組件 leave_notify_event //鼠標指針離開組件 configure_event //屬性改變 focus_in_event //獲得聚焦 focus_out_event //失去聚焦 map_event //映射 unmap_event //消失 property_notify_event //屬性改變 selection_clear_event //選擇清除 selection_request_event //選擇請求 selection_notify_event //選擇通知 proximity_in_event //接近 proximity_out_event //離開 drag_begin_event //拖開始 drag_request_event //拖請求 drag_end_event //拖結束 drop_enter_event //放進入 drop_leave_event //放離開 drop_data_available_event //放數據可用 * 上例中在窗口管理器中關閉窗口失效(它的好處是給用戶一個重新確認的機會),原因是函數 gint delete_event( GtkWidget *widget, GdkEvent *event, gpointer data ) 返回 TRUE,這樣 GTK 組件不會發出 "destroy" 信號。 * 當按鈕按下時,調用函數 void destroy( GtkWidget *widget, gpointer data ) { gtk_main_quit(); } 這樣在主程序中的 gtk_main()便退出循環,程序隨之結束。 * 函數gtk_init (&argc, &argv)初始化GTK程序并傳遞響應的命令行參數給 GTK,當參數符合時,便從列表中清除,剩下的參數再由用戶處理 * 語句 window = gtk_window_new (GTK_WINDOW_TOPLEVEL) 創建頂級窗口, 參量的意義是: GTK_WINDOW_TOPLEVEL: 頂級窗口 GTK_WINDOW_DIALOG: 對話框窗口 GTK_WINDOW_POPUP: 彈出式窗口,不受窗口管理器管理,即 無邊界窗口 * 語句 gtk_container_set_border_width (GTK_CONTAINER (window), 10) 把窗口的內邊界寬度設置為10。 * 語句 gtk_container_add (GTK_CONTAINER (window), button) 把剛建立 的按鈕組件加入到 window 中。請注意這里在使用 window 時把它投影 成GTK_CONTAINER,在以后的GTK編程中會經常遇到類似的投影。 * 語句 gtk_widget_show (window); 表示已經設置完窗口的屬性,可以顯示 了。 * 事件循環 gtk_main(),由 GTK 內部處理
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -