在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

GTK之信號和回調函數

嵌入式技術 ? 來源:嵌入式技術 ? 作者:嵌入式技術 ? 2022-11-24 08:32 ? 次閱讀

? 在 2.0 版,信號系統已從 GTK 移到 GLib,因此在函數和類型的說明中有前綴 “g_” 而不是 “gtk_”。

GTK 是一個事件驅動的工具包,意味著它會等在gtk_main() 那里, 直到下一個事件發生, 才把控制權傳給適當 的函數。控制權的傳遞是使用“信號”的辦法來完成的。(注意這里的信號并不等同于Unix 系統里的信號,并且也不是用它們實現的,雖然使用的術語是一樣的。)

1.常用信號

??構件能夠發送各種信號,信號可以由用戶操作而引起,也可以由函數模擬事件產生,常見信號如下。

構件 信號 意義 產生信號函數
windows “destroy” 關閉窗口時發出該信號
button “clicked” 點擊按鈕,這是按下和釋放操作的組合 gtk_button_clicked(button)
“clicked” 點擊按鈕,這是按下和釋放操作的組合 gtk_button_clicked(button)
“clicked” 點擊按鈕,這是按下和釋放操作的組合 gtk_button_clicked(button)
“pressed” 按下按鈕 gtk_button_pressed(button)
“released” 釋放按鈕 gtk_button_released(button)
toggle_button “toggled 開關按鈕
listbox “select” 列表框被選擇
“selection_changed” 列表框選擇被更改
GTKRadioMenuItem activate” 菜單選項被選擇

? GTK+的兩個基本機制是delete_event事件和destroy信號,當將要關閉窗口時,出現delete_event事件。當關閉窗口時,發出destroy信號。對于delete_event事件,頂層窗口應該設有相應的回呼函數。因為delete_event表示用戶需要關閉應用軟件。對于delete_event信號增加回呼函數包括兩個步驟。

delete_event的回呼函數應該返回布爾值,用以表示是否允許關閉窗口。返回TRUR值保持窗口打開,返回FALSE值表示窗口可以關閉。如果關閉窗口,接著發出destroy信號告訴應用程序就要關閉窗口。

2.信號連接和處理函數

2.1 信號連接函數 g_signal_connect

??每個信號和每個對象可以有多個回調函數,并且它們會按設置的順序依次運行。

 /* 信號連接函數*/
#define g_signal_connect(instance, detailed_signal, c_handler, data)
形參:instance  --void*指針,要發出信號的構件
detailed_signal  -- char *指針,連接的信號的名稱
      c_handler  --信號被捕獲時所要調用的函數
      data   -- void*指針,傳遞給信號處理函數(回調函數)的數據
返回值:gulong類型,返回識別回調函數的標識
第三個參數即回調函數一般形式如下:
void callback_func( GtkWidget *widget,gpointer callback_data );
形參:widget -- 指向發出信號的構件的指針
      callback_data  --g_signal_connect傳入的參數
注意:上面回調函數的聲明只是一般的形式, 有些構件的特殊信號會用不同的調用參數。

2.2 g_signal_connect返回值

信號連接函數g_signal_connect返回值為glong類型,返回一個識別回調函數的標志。因為每個信號和每個對象可以有多個回調函數,并且它們會按設置的順序依次運行。所以可以通過這個返回標志,可通過下面函數將實現的回調函數刪除:

g_signal_handler_disconnect(gpointer instance, gulong handler_id)

?所以,通過傳遞你想在上面刪除處理函數的構件,以及某個signal_connect函數返回的標識,你就可以中斷一個信號處理函數的連接。
也可以使用g_signal_handler_block() 和 g_signal_handler_unblock() 這類函數來暫時斷開信號處理函數的連接。

void g_signal_handler_block (gpointer instance, gulong handler_id);
void g_signal_handlers_block_by_func( gpointer object,GCallback func,gpointer data );
void g_signal_handler_unblock (gpointer instance,gulong   handler_id);
void g_signal_handlers_unblock_by_func( gpointer object,GCallback func,gpointer data );

2.3 信號連接函數 g_signal_connect_swapped

/*信號連接函數*/
#define g_signal_connect_swapped(instance, detailed_signal, c_handler, data)
g_signal_connect_swapped()和g_signal_connect() 相同,只是回調函數只用一個參數,一個指向GTK對象的指針。所以當使用這個函數連接信號時,回調函數應該是這樣的形式:
	void callback_func( GtkObject *object );

??擁有兩個函數來設置信號連接的目的只是為了允許回調函數有不同數目的參數。GTK 庫中許多函數僅接受一個單獨的構件指針作為其參數,所以對于這些函數你要用 g_signal_connect_swapped(),然而對你自己定義的函數,你可能需要附加的數據提供給你的回調函數。

3 事件

??除有信號機制外,還有一套 events 反映 X 事件機制。回調函數可以與這些事件連接。

GDK_NOTHING
GDK_DELETE
GDK_DESTROY
GDK_EXPOSE
GDK_MOTION_NOTIFY
GDK_BUTTON_PRESS
GDK_2BUTTON_PRESS
GDK_3BUTTON_PRESS
GDK_BUTTON_RELEASE
GDK_KEY_PRESS
GDK_KEY_RELEASE
GDK_ENTER_NOTIFY
GDK_LEAVE_NOTIFY
GDK_FOCUS_CHANGE
GDK_CONFIGURE
GDK_MAP
GDK_UNMAP
GDK_PROPERTY_NOTIFY
GDK_SELECTION_CLEAR
GDK_SELECTION_REQUEST
GDK_SELECTION_NOTIFY
GDK_PROXIMITY_IN
GDK_PROXIMITY_OUT
GDK_DRAG_ENTER
GDK_DRAG_LEAVE
GDK_DRAG_MOTION
GDK_DRAG_STATUS
GDK_DROP_START
GDK_DROP_FINISHED
GDK_CLIENT_EVENT
GDK_VISIBILITY_NOTIFY
GDK_NO_EXPOSE
GDK_SCROLL
GDK_WINDOW_STATE
GDK_SETTING

??所以, 連接一個回調函數到這些事件之一,我們會這樣用:

g_signal_connect (G_OBJECT (button), "button_press_event",G_CALLBACK (button_press_callback), NULL);

??這里假定button是一個按鈕構件。現在,當鼠標位于按鈕上并按一下鼠標時,函數 button_press_callback() 會被調用。這個函數應該聲明為:

static gint button_press_callback( GtkWidget *widget,
						GdkEventButton *event,
						gpointer data );

?注意,我們可以把第二個參數類型聲明為 GdkEventButton,因為我們知道哪個類型的事件會發生。
這個函數的返回值指示這個事件是否應該由 GTK 事件處理機制做進一步的傳播。 返回 TRUE 指示這個事件已經處理了,且不應該做進一步傳播。 返回 FALSE 繼續正常的事件處理。

3.1 按鍵連接信號關閉窗口示例

#include 
void hello(GtkWidget *widget,gpointer data)
{
	g_print("按鍵信號觸發成功n");
}
/*事件處理回調函數*/
gint delete_event(GtkWidget *widget,GdkEvent *evnet,gpointer data)
{
	g_print("事件處理回調函數調用成功n");
	return TRUE;//TRUE表示繼續,FALSE表示關閉
}

void destroy(GtkWidget *widget,gpointer data)
{
	g_print("銷毀窗口n");
	gtk_main_quit();//退出程序
}
int main(int argc,char *argv[])
{
	GtkWidget *window;
	GtkWidget *button;
	/*gtk初始化*/
	gtk_init(&argc, &argv);
	/*創建窗口*/
	window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title(GTK_WINDOW(window),"GTK");/*設置窗口標題*/
	/*信號連接函數*/
	g_signal_connect(GTK_OBJECT(window),"delete_event",G_CALLBACK(delete_event),NULL);
	g_signal_connect(GTK_OBJECT(window),"destroy", G_CALLBACK(destroy), NULL);
	/*設置容器對象屬性:設置窗口邊框寬度為100*/
	gtk_container_set_border_width(GTK_CONTAINER(window),100);
	/*創建新的按鈕,設置按鈕信息為hello*/
	button=gtk_button_new_with_label("hello");
	g_signal_connect(GTK_OBJECT(button),"clicked",G_CALLBACK(hello),NULL);
	g_signal_connect_swapped(GTK_OBJECT(button),"clicked",G_CALLBACK(gtk_widget_destroy),GTK_OBJECT(window));
	/*將按鈕放入窗口中*/
	gtk_container_add(GTK_CONTAINER(window),button);
	/*顯示控件*/
	gtk_widget_show_all(window);
	/*等待事件*/
	gtk_main();
	return 0;
}
poYBAGN-u4qAVy5YAAAgfJueK9k675.png#pic_center

程序運行效果:

當我們用鼠標按下hello按鈕,按鍵發出clicked信號,觸發hello回調函數,接著調用下一個信號處理函數gtk_widget_destroy(),將窗口構件參數傳遞給該函數,銷毀窗口,從而窗口發出destroy信號,然后調用我們實現號的回調函數destroy(),實現程序退出。
審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 信號
    +關注

    關注

    11

    文章

    2791

    瀏覽量

    76758
  • 回調函數
    +關注

    關注

    0

    文章

    87

    瀏覽量

    11561
收藏 人收藏

    評論

    相關推薦

    一文詳解C語言函數指針與調函數

    在講調函數之前,我們需要了解函數指針。
    發表于 10-19 09:34 ?794次閱讀

    C語言里面的函數指針和調函數

    在講調函數之前,我們需要了解函數指針。
    發表于 12-13 10:28 ?636次閱讀

    C語言調函數學習

    對指針的應用是C語言編程的精髓所在,而回調函數就是C語言里面對函數指針的高級應用。簡而言之,調函數
    發表于 05-27 09:44 ?7206次閱讀

    LabWindows/CVI 程序 調函數設計

    調函數是系統框架設計中非常重要的一種手段,所謂調函數(callback )是指一個通過
    發表于 05-03 16:54 ?1.1w次閱讀
    LabWindows/CVI 程序 <b class='flag-5'>回</b><b class='flag-5'>調</b><b class='flag-5'>函數</b>設計

    調函數的詳細資料說明

    異步事件的處理,首先將異步事件發生時需要執行的代碼編寫成一個函數,并將該函數注冊成為調函數,這樣當該異步事件發生時,系統會自動調用事先注冊
    發表于 02-28 08:00 ?6次下載
    <b class='flag-5'>回</b><b class='flag-5'>調</b><b class='flag-5'>函數</b>的詳細資料說明

    C語言函數調函數

    來源:嵌入式客棧 1 什么是調函數?首先什么是調呢? 我的理解是:把一段可執行的代碼像參數傳遞那樣傳給其他代碼,而這段代碼會在某個時刻被
    的頭像 發表于 09-11 09:57 ?4133次閱讀

    STM32編程時,如何確定中斷調函數的入口

    STM32編程時,如何確定中斷調函數函數名換句話說,就是如何找到中斷調
    發表于 11-23 18:06 ?13次下載
    STM32編程時,如何確定中斷<b class='flag-5'>回</b><b class='flag-5'>調</b><b class='flag-5'>函數</b>的入口

    詳解調函數的概念及使用步驟

    調函數就是一個被作為參數傳遞的函數。在C語言中,調函數
    的頭像 發表于 05-26 15:20 ?4034次閱讀

    一文詳解C/C++調函數

    首先看一下調函數的官方解釋:調函數就是一個通過函數
    的頭像 發表于 02-12 09:20 ?1596次閱讀

    函數指針和調函數的使用方法

    了解開發語言的朋友應該都會對調函數有所了解,在很多的程序開發語言中都能看到調的身影。很多場景下,當某個條件成立以后我們希望代碼執行某些指
    的頭像 發表于 04-10 15:08 ?1105次閱讀

    C語言技巧調函數

    在講調函數之前,我們需要了解函數指針。
    的頭像 發表于 04-18 11:50 ?785次閱讀

    C語言|調函數的不同用法

    調函數是個高級操作技巧,也是日常項目中常常使用到的技能。之所以說調函數是個高級操作技巧,是因
    發表于 07-10 10:34 ?1314次閱讀

    應用筆記 | 淺談STM32庫里的調函數

    關鍵字:調函數,HAL庫 ? 目錄預覽 1.調函數 2.STM32固件庫里的
    的頭像 發表于 09-14 17:10 ?3665次閱讀
    應用筆記 | 淺談STM32庫里的<b class='flag-5'>回</b><b class='flag-5'>調</b><b class='flag-5'>函數</b>

    ??嵌入式中調函數的實現方法

    調函數的命名規范沒有固定的標準,但是根據通用慣例和編碼規范,調函數的命名應該能夠反映
    發表于 03-04 14:49 ?723次閱讀

    調函數(callback)是什么?調函數的實現方法

    調函數是一種特殊的函數,它作為參數傳遞給另一個函數,并在被調用函數執行完畢后被調用。
    發表于 03-12 11:46 ?2940次閱讀
    主站蜘蛛池模板: 国产精品资源网| 色天天网| 午夜在线观看免费高清在线播放| 午夜在线观看免费观看大全| 800免费资源网| 日产精品卡二卡三卡四卡无卡乱码| 国产精品久久久久国产精品三级 | 美国bj69| 国产人人澡| 男人不识本网站上遍色站也枉然| 国产成人亚洲综合a∨婷婷| 亚洲第一黄色网址| 高清一级| 激情亚洲婷婷| 日本xxxx色视频在线观看| 精品国产亚洲人成在线| 天天躁日日躁狠狠躁一级毛片| 国产精品久久久久久久久免费| 亚洲春色在线| 色综合天天网| 亚洲人成电影| 欧美日韩高清一本大道免费| 成年人一级毛片| 全免费一级毛片在线播放| 黄色视奸| 国产美女精品久久久久中文 | 夜夜爽夜夜操| vip影院在线观看| 四虎国产精品永久在线网址| 精品四虎免费观看国产高清午夜| 天天弄| 亚洲一区二区三区四区五区六区| 天堂tv亚洲tv日本tv欧美人tv| 很狠操| 国产小视频免费| 99国内视频| 久久鲁视频| 久久国产免费| 伊人久久大| 狠狠色丁香婷婷综合视频| 99福利|