GTK+圖形化應用程式開發學習筆記(三)—窗體
五、回撥函式
由於程式必須能夠對使用者的操作做出相應,在基於GUI的程式設計中訊號是必要的。移動滑鼠,按下按鈕,敲入正文或者關閉視窗,將給應用軟體的回呼函式提供訊號。訊號可能需要應用軟體來加以處理。如:字處理軟體有使字型變黑的按鈕。如果使用者按下了按鈕,就需要呼叫使字型變黑的程式。與此型別,如果使用者關閉了主視窗,在實際關閉視窗以前要進行某些處理(如儲存檔案,清除等)。
在GTK+中經常產生各種訊號,多數情況下訊號被忽略。以按鈕構件為例,應用軟體有專門用於按鈕的訊號。當用戶按下滑鼠或釋放滑鼠按鈕時,當用戶電機滑鼠時,或者當滑鼠移過按鈕或離開按鈕時都產生各自的訊號。應用程式可以忽略掉一些訊號,只對感興趣的事件加以處理。
當需要對訊號進行處理時,需要用GTK+登記回撥函式,並將它和構件聯絡在一起。構件可以登記回撥函式,回撥函式可與多個構件聯絡在一起。
6.
名稱:: |
g_signal_connect |
功能: |
訊號登記函式 |
標頭檔案: |
#include <gtk/gtk.h> |
函式原形: |
gulong g_signal_connect(gpointer *object,const gchar *name,GCallback func,gpointer data); |
引數: |
object 發出訊號的控制元件 name 訊號名稱 func 回撥函式(對訊號要採取的動作) data 傳給回撥函式的資料 |
返回值: |
g_signal_connect用於登記一個GTK+訊號,其功能有點像普通訊號登記函式signal.當某個空間發出訊號,程式就會去執行由g_signal_connect登記的回撥函式。
下面我們把上面的程式稍微改動一下,使它可以正常退出。
/*base2.c*/ #include <gtk/gtk.h> int main(int argc, char* argv[]) { GtkWidget *window; gtk_init(&argc,&argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(GTK_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL); gtk_widget_show(window); gtk_main(); return FALSE; } |
$ gcc -o base2 base2.c 'pkg-config --cflags --libs gtk+-2.0'
$./base2
其中destroy為GTK+最基本訊號之一,當關閉視窗時,發出該訊號。還有一個是delete_event, 當將要關閉視窗時,發出該訊號。
程式中添加了gtk_signal_connect函式,當用戶關閉視窗時gtk_signel_connect函式呼叫gtk_main_quit函式來關閉程式。
大家也可以編寫回調函式,在回撥函式裡結束程式。這樣做的好處是當用戶試圖退出一個程式時,程式可以提示你是否真的退出。
自己編寫回調函式的程式例子:
/*base2.c*/ #include <gtk/gtk.h> ginit destroy(GtkWidget *,gpointer) int main(int argc, char* argv[]) { GtkWidget *window; gtk_init(&argc,&argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(GTK_OBJECT(window),"destroy",G_CALLBACK(destroy),NULL); gtk_widget_show(window); gtk_main(); return 0; } ginit destroy(GtkWidget *widget,gpointer gdata) { g_print(“Quitting!/n”); gtk_main_quit(); return(FALSE); } |
$ gcc -o base3 base3.c 'pkg-config --cflags --libs gtk+-2.0'
$./base3
注意,當關閉視窗時,將在啟動應用程式的控制檯上顯示Quitting訊息。這是由回撥函式顯示的。
從上面的程式可以看到,g_signal_connect對應的回撥函式形式為ginit destroy(GtkWidget *widget,gpointer gdata)有兩個引數。GTK+還有一個訊號登記函式。g_signal_connect_swapped.,它的作用和gtk_signal_connect相同。不同的是g_signal_connect_swapped.對應的回撥函式只有一個引數,形式為ginit destroy(GtkWidget *widget)。是因為GTK+有一些只接收一個引數的函式(比如gtk_widget_destroy)。
7.
名稱:: |
g_signal_connect_swapped |
功能: |
訊號登記函式 |
標頭檔案: |
#include <gtk/gtk.h> |
函式原形: |
gulong g_signal_connect_swapped(gpointer *object,const gchar *name,GCallback func,gpointer *widget); |
引數: |
object 發出訊號的控制元件 name 訊號名稱 func 回撥函式(對訊號要採取的動作) winget 傳給回撥函式的資料 |
返回值: |
相關推薦
GTK+圖形化應用程式開發學習筆記(三)—窗體
五、回撥函式 由於程式必須能夠對使用者的操作做出相應,在基於GUI的程式設計中訊號是必要的。移動滑鼠,按下按鈕,敲入正文或者關閉視窗,將給應用軟體的回呼函式提供訊號。訊號可能需要應用軟體來加以處理。如:字處理軟體有使字型變黑的按鈕。如果使用者按下了按鈕,就需要呼叫使字型變黑的程式。與此型別,如果使用者關閉了
GTK+圖形化應用程式開發學習筆記(二)—Glib庫(1)
在學習GTK+之前我們需要先學習一下 glib的有關知識。因為我們將會在以後的學習中遇到這些知識。由於本筆記不是專門介紹glib的,所以下面的介紹不會太詳細。 <?xml:namespace prefix = o ns = "urn:schemas-microsoft
GTK+圖形化應用程式開發學習筆記(十七)—框架構件、比例框架構件
一、框架構件 框架構件(GtkFrame)可以用於在盒子中封裝一個或一組構件,框架本身還可以有一個標籤。標籤的位置和風格可以靈活改變。 我們用gtk_frame_set_label函式建立框架構件。 1. 名稱:: gtk_frame_new 功能: 建立
GTK+圖形化應用程式開發學習筆記(二十)—分欄列表構建
分欄列表構件(GtkCList)是較常用的構件,它是多列列表構件,可以非常方便的處理數千列的資訊。每一列都可以有一個標題,而且可以是活動的。你還可以將函式繫結到列選擇上。 一、建立分欄列表構件 建立GtkCList構件的方法和建立其他構件的方法是類似的。 1. 名
Windows 8 Directx 開發學習筆記(四)示例程式小結
VS2012的示例程式包括了最基本的DirectX流程,涉及許多知識,所以看完程式碼之後還是感覺沒有頭緒,打算對整個過程再整理一下,方便進一步的學習。 正方體在空間中可以用它的8個頂點定義,而每個頂點可以包含除座標外的資訊,如顏色。設定好屬性後,資料是以陣列的形式存在記憶體
Git學習筆記(三)遠程庫(GitHub)協同開發,fork和忽略特殊文件
tex 情況 learn 多人 版本管理 獲得 logs 秘鑰 多個 遠程庫 遠程庫,通俗的講就是不再本地的git倉庫!他的工作方式和我們本地的一樣,但是要使用他就需要先建立連接! 遠程庫有兩種,一個是自己搭建的git服務器;另一種就是使用GitHub,這個網站就是
學習筆記(三)——數據庫命令的應用
cal 名稱 nbsp ges bsp tex 密碼 連接字符串 集合 學習筆記(三)——數據庫命令的應用 一、存儲過程 (一)基本概念 存儲過程就是固化SQL數據庫系統內部的SQL語句,這樣做的好處是可以提高執行效率,提高數據庫的安全性,減
西門子PLC-1200 SCL語言開發學習筆記 (一)
選擇 創建 date times 重設 全局 實例 變量 訪問 一、簡介和背景 PLC一般使用梯形圖開發,但是梯形圖適合電工使用而不是程序員使用,對我們來說開發困難,門檻高,幸好PLC的開發標準還帶了類pascal的高級語言,在西門子這裏叫SCL語言,這對於我們程序
安卓開發學習筆記(二):Android Stuidio無法引用Intent來創建對象,出現cannot resolve xxx
編譯器 port stact 消失 click first 紅色 xxx font 筆者在進行安卓開發時,發現自己的代碼語法完全沒有問題。尤其是創建intent對象的時候,語法完全是正確的,但是Android Stuidio卻顯示報錯,Intent類顯示為紅色,如圖所示:
Linux開發學習筆記(二)
Shell程式設計 1、簡單介紹 Shell 指令碼(shell script),是一種為 shell 編寫的指令碼程式。Shell 程式設計跟 java、php 程式設計一樣,只要有一個能編寫程式碼的文字編輯器和一個能解釋執行的指令碼直譯器就可以了。簡單地講,shell程式設計就是對一
Linux開發學習筆記(一)
安裝虛擬機器並聯網 1、安裝虛擬機器vmware: 安裝完vmware並開啟——》點選建立新的虛擬機器——》自定義——》下一步——》選擇稍後安裝作業系統——》選擇Linux Ubuntu 64位——》給虛擬機器取名字、選擇安裝路徑——》配置處理器數量1和核心數量2——》虛擬機器記憶體選擇
微信小程式入門學習筆記(二)——阿里雲伺服器PHP MYSQL Apache配置
持續更新 持續學習 感謝原文大佬連結 https://www.linuxidc.com/Linux/2017-08/146220.htm 筆者在阿里雲上買了輕量應用伺服器 學生認證通過以下 便宜的 選擇的CentOS 7.3 64位 https://promot
微信小程式入門學習筆記(一)
入門級的跳轉格式: wx.redirectTo():不能返回上一層頁面 wx.navigateTo():用於頁面的跳轉 以上兩個不能跳轉於"tabBar" 因此跳轉"tabBar": wx.switchTab 感謝大佬的教程解答 了我的問題 以下附上原文連結 作者
微信小程式——學習筆記(三)檢視層(1)
WXS—(WeiXin Script)是小程式特有的一套指令碼語言。wxs有自己的語法,今天就學習一下wxs的語法。 1) wxs程式碼可以編寫在wxml檔案中的<wxs>標籤內,或者是XXX.wxs的檔案內。不管是標籤還是檔案都是一個單獨的模組。 2) 每個模組裡面定義的變數與函式
嵌入式核心及驅動開發之學習筆記(三) 點燈實驗
完成應用程式通過驅動控制硬體的實現。實驗建立在之前的框架上,我們先實現使用者層與核心層之間的資料互動,驅動程式拿到使用者傳來的指令後,就可以執行點燈的動作了。 應用程式與驅動資料互動 對於驅動程式而言,使用copy_to_user 和 copy_from_user
安卓開發學習筆記(一):如何用Android Stuidio匯出apk檔案?
一,首先,我們在選單欄上找到這一欄: 然後點選build,再點選generate apk,然後出現以下介面: 由於之前我們並沒有進行apk檔案的生成,因此需要這個apk key做一個驗證,以防您的app上線之後被別人盜用,同時證明自己對這個app的擁有權。key store path就是您app key所
安卓開發學習筆記(四):Android Stuidio無法實現隱式Intent是為什麼?
1 package com.example.lenovo.activitytest; 2 3 import android.support.v7.app.AppCompatActivity; 4 import android.os.Bundle; 5 import android.view
微信小程式學習筆記(三)----初識小程式程式碼、輪播圖實現
從這一節開始我們就開始接觸小程式前臺程式碼了,其實前臺邏輯還是比較簡單的,學習難度比學習一個前端框架難不了多少,記得以前一開始學前端框架的時候,流程就是:熟悉一下--檢視元件--找到要用的--複製貼上,其實對於大部分人來說,小程式前臺也是一樣。 首先,我們可以先看下小程式的
安卓開發學習筆記(五):史上最簡單且華麗地實現Android Stutio當中Webview控制元件https/http協議的方法
一.我們先在XML當中自定義一個webview(Second_layout.xml) 程式碼如下: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.an
微信小程式學習筆記(三)
最新遇到一個問題,資料庫的資料遲遲讀取不出來data.result為null,解決辦法很簡單,最後定位出來是查詢資料庫的雲函式的問題。在這裡記錄一下定位問題的過程和思路 1.呼叫微信小程式雲函式的問題優先定位雲函式的問題,通過“雲開發控制檯”檢視小程式的呼叫日誌發現呼叫報錯 “Reference