大家一起用gtk程式設計2 新增按鈕和連線事件

2021-04-13 06:21:15 字數 2259 閱讀 7037

大家一起用gtk程式設計2(新增按鈕和連線事件)

上回說道,咱們使用gtk建立了乙個最簡單的gtk程式,簡單到只能顯示乙個200x200點大小的空白視窗,並在標題欄顯示「hello,dubuntu!」的字樣! 雖然簡單,但確實是個不錯的開端,好了,咱們現在在視窗中新增乙個按鈕。

執行效果:

**:hello_dubuntu2.c 

/* 本例的主要目的是在視窗中顯示乙個按鈕,

* 並且單擊按鈕退出程式

*/#include

void

cb_button(gtkwidget *widget, gpointer data)

intmain(int argc, char *argv)

編譯: gcc -o hello_dubuntu2  hello_dubuntu2.c  `pkg-config --cflags --libs gtk+-2.0`

程式注釋:

1) 在gtk中,預設新增到視窗中的控制項會自動佔滿所有的空間,因此當我們的程式執行時,將視窗放大時按鈕也跟著放大了;這點同windows及qt是不相同 的。正因為如此,在gtk控制項庫中有幾個控制項專門用來進行視窗布局,比如說vbox, hbox, table, gtkpixed 等, 通過對它們的靈活操作,可以得到乙個非常漂亮的應用程式介面!這將在以後進行詳細介紹。

2)關於事件與**函式

事件:gtk同許 多其它的圖形程式設計庫相似,都採用事件驅動方式來工作,這就關係到出現什麼事件做什麼工作的問題。(在gtk中還有個「訊號」的概念,同「事件」的概念不容 易分清楚,特別是剛開始學習時,不過沒關係,初期我們就把它們當乙個概念來理解),在gtk2.0中,一般使用 g_signal_connect() 函式來註冊每個物件和其對應的處理函式,如本例所示。

**函式:實際上就是乙個普通的函式,不過它並不會被顯示地直接呼叫,而是把它的位址註冊到另乙個函式,在那個函式中間接地對它進行呼叫,這也是**的由來。

3)在本例中,我們通過下列語句為「button」註冊了乙個"clicked"事件的**函式「cb_button",字首」cb「即」call back(**)」的意思。

g_signal_connect(g_object(button), "clicked", g_callback(cb_button),null);

由於註冊了上邊的**函式,因此當我們用滑鼠單擊按鈕時,就會激發按鈕的「clicked」事件,因此會呼叫 cb_button() 函式,而此函式中的語句  gtk_main_quit() 的作用是退出程式,因此我們單擊按鈕後整個程式就會退出。

4) 當然,這個程式還有個小「bug」,即直接單擊右上角的「關閉按鈕」關閉程式後,雖然主視窗消失了,但程式並沒有直接地退出,還駐留在記憶體中。 這是因為當單擊右上角的「關閉按鈕」關閉程式後,會產生「destroy」訊號,而我們並沒有為此訊號使用 g_signal_connect() 函式註冊相關的處理函式,因此它的行為並不是我們所期望的;解決方法就是為主視窗的」destroy"訊號註冊乙個**函式,並在此**函式中呼叫 gtk_main_quit() 以便退出程式,將如下**新增到hello_dubuntu2.c 的 gtk_main() 函式呼叫的上邊就行:

g_signal_connect(g_object(main_window), "destroy", g_callback(cb_button),null); 

請注意:在這裡我們再一次使用了 "cb_button「函式,這是因為它的行為正是我們想要的,即」呼叫此**函式後, 退出程式「。

好了,今天的內容差不多了,很多內容都沒有深入研究,不過沒關係,慢慢來,以後將要以專題的形式對gtk的每個部件及api進行深入並細緻的說明。如果您對本例中的一些概念沒有完全理解也沒有關係,繼續下一步,很容易理解的!千萬不要呆在原地不動。

下回預告:將簡要說明如何編寫簡單的 makefile 檔案來組織我們的源程式,另外還將介紹如何利用 gdb 對我們的程式進行除錯!精彩不容錯過。

附:新增」destroy「訊號處理後的 hello_dubuntu2.c

hello_dubuntu2.c

/* 本例的主要目的是在視窗中顯示乙個按鈕,

* 並且單擊按鈕退出程式

*/#include

void

cb_button(gtkwidget *widget, gpointer data)

intmain(int argc, char *argv)

編譯: gcc -o hello_dubuntu2  hello_dubuntu2.c  `pkg-config --cflags --libs gtk+-2.0`

大家一起用gtk程式設計6 按鈕 單選 複選元件

呵呵,作者不寫了,我就 到這裡了哈,自己慢慢學習了哦。大家一起用gtk程式設計6 按鈕 單選 複選元件 我們這裡將介紹幾種按鈕的使用方法,有些東西可能並不認為它是按鈕,比如單選框和核取方塊,但是這些控制項確實有相似的屬性,因此gtk將它們歸為一類,並將 標準按鈕 作為基類,其它按鈕都派生自該型別,下...

getenv與strtok一起用的怪問題

吾程式設計時欲獲取環境變數path的值,起初 如下 char path path getenv path 然後用如下 拆分path p strtok path,dowhile p strtok null,null 然strtok函式會將path中的 改為 0 字元,而我又在程式中多次呼叫上面的 發現...

週末一起用文字資料庫玩玩Code First

經過多年的沉澱,在文字的操作上,已經有了些規模,因此,本文寫出來和大夥分享一下。2 解壓就乙個dll,專案新增引用即可。3 既然是code first,那我們就直接寫實體類,示例如下 public class users cyq.data.orm.ormbase public int id publ...