1.微調(diào)按鈕簡(jiǎn)介
? 微調(diào)按鈕(Spin Button)構(gòu)件通常用于讓用戶從一個(gè)取值范圍你選擇一個(gè)值。它由一個(gè)文本輸入框和旁邊的向上和向下兩個(gè)按鈕組成。點(diǎn)擊某一個(gè)按鈕會(huì)讓文本輸入框里的數(shù)值大小在一定范圍你改變。文本輸入框里也可以直接輸入一個(gè)特定值。
微調(diào)按鈕構(gòu)件允許其中的數(shù)值沒有小數(shù)位或具有指定的小數(shù)位,并且數(shù)值可以按一種可配置的方式增加或減小。在按鈕較長(zhǎng)時(shí)間呈按下狀態(tài)時(shí),構(gòu)件的數(shù)值會(huì)根據(jù)工具按下時(shí)間的長(zhǎng)短加速變化。
微調(diào)按鈕用一個(gè)調(diào)整對(duì)象來維護(hù)該按鈕能夠取值的范圍。微調(diào)按鈕構(gòu)件因此而具有了很強(qiáng)大的功能。
2.調(diào)整對(duì)象簡(jiǎn)介
GTK 有多種構(gòu)件能夠由用戶通過鼠標(biāo)或鍵盤進(jìn)行調(diào)整,比如范圍構(gòu)件。還有一些構(gòu)件,比如說 GtkText 和GtkViewport,內(nèi)部都有一些可調(diào)整的屬性。
很明顯,當(dāng)用戶調(diào)整范圍構(gòu)件的值時(shí),應(yīng)用程序需要對(duì)值的變化進(jìn)行響應(yīng)。一種辦法就是當(dāng)構(gòu)件的調(diào)整值發(fā)生變化時(shí),讓每個(gè)構(gòu)件引發(fā)自己的信號(hào),將新值傳遞到信號(hào)處理函數(shù)中,或者讓它在構(gòu)件的內(nèi)部數(shù)據(jù)結(jié)構(gòu)中查找構(gòu)件的值。 但是,也許需要將這個(gè)調(diào)整值同時(shí)連接到幾個(gè)構(gòu)件上,使得調(diào)整一個(gè)值時(shí),其它的構(gòu)件都隨之響應(yīng)。最明顯的示例就是將一個(gè)滾動(dòng)條連接到一個(gè)視角構(gòu)件(viewport)或者滾動(dòng)的文本區(qū)(text area)上。如果每個(gè)構(gòu)件都要有自己的設(shè)置或獲取調(diào)整值的方法,程序員或許需要自己編寫很復(fù)雜的信號(hào)處理函數(shù),以便將這些不同構(gòu)件之間的變化同步或相關(guān)聯(lián)。
GTK用一個(gè)調(diào)整對(duì)象(Adjustment object)解決了這個(gè)問題。調(diào)整對(duì)象不是構(gòu)件,但是為構(gòu)件提供了一種以抽象、 靈活的方法來傳遞調(diào)整值信息。調(diào)整對(duì)象最明顯的用處就是為范圍構(gòu)件(比如滾動(dòng)條和比例構(gòu)件)儲(chǔ)存配置參數(shù)和值。 然而,因?yàn)檎{(diào)整對(duì)象是從 Object派生的,在其正常的數(shù)據(jù)結(jié)構(gòu)之外,它還具有一些特殊的功能。 最重要的是,它們能 夠引發(fā)信號(hào),就像構(gòu)件一樣,這些信號(hào)不僅能夠讓程序?qū)τ脩粼诳烧{(diào)整構(gòu)件上的輸入進(jìn)行響應(yīng),還能在可調(diào)整構(gòu)件之間透明地傳播調(diào)整值。
在許多其它的構(gòu)件中都能夠看到調(diào)整對(duì)象的用處。比如進(jìn)度條、 視角 、 滾動(dòng)窗口等。
- 微調(diào)按鈕中創(chuàng)建調(diào)整對(duì)象函數(shù):
GtkAdjustment *gtk_adjustment_new (gdouble value,
gdouble lower,gdouble upper,
gdouble step_increment,gdouble page_increment,
gdouble page_size);
形參:value -- 微調(diào)按鈕初始值
lower、upper --構(gòu)件允許的最大值、最小值
step_increment --鼠標(biāo)左鍵按下構(gòu)件一次增加/減小的值
page_increment --鼠標(biāo)右鍵下構(gòu)件一次增加/減少的值
page_size --沒有用到
返回值:返回微調(diào)按鈕構(gòu)件對(duì)象
- 微調(diào)按鈕創(chuàng)建函數(shù):
GtkWidget *gtk_spin_button_new (GtkAdjustment *adjustment,gdouble climb_rate,guint digits)
形參:adjustment --調(diào)整對(duì)象
climb_rate --指明構(gòu)件數(shù)值變化的加速度(長(zhǎng)時(shí)間按住按鈕, 數(shù)值會(huì)加速變化)。介于0.0~1.0之間
digits --微調(diào)按就值小數(shù)位數(shù)
- 微調(diào)按鈕參數(shù)配置函數(shù):
void gtk_spin_button_configure( GtkSpinButton *spin_button,GtkAdjustment *adjustment,
gdouble climb_rate,guint digits );
形參:spin_button --微調(diào)按鈕控件
adjustment --調(diào)整對(duì)象
climb_rate --指明構(gòu)件數(shù)值變化的加速度(長(zhǎng)時(shí)間按住按鈕, 數(shù)值會(huì)加速變化)。介于0.0~1.0之間
digits --微調(diào)按就值小數(shù)位數(shù)
- 設(shè)置或獲取構(gòu)件內(nèi)部使用的調(diào)整對(duì)象:
/*獲取微調(diào)按鈕調(diào)整對(duì)象信息*/
GtkAdjustment *gtk_spin_button_get_adjustment (GtkSpinButton *spin_button);
/*設(shè)置微調(diào)按鈕調(diào)整對(duì)象信息*/
gtk_spin_button_set_adjustment (GtkSpinButton *spin_button,GtkAdjustment *adjustment);
- 設(shè)置微調(diào)按鈕小數(shù)位數(shù):
void gtk_spin_button_set_digits (GtkSpinButton *spin_button,guint digits)
形參:spin_button --微調(diào)按鈕控件
digits --微調(diào)按鈕數(shù)值小數(shù)位數(shù)
- 設(shè)置微調(diào)按鈕數(shù)值:
void gtk_spin_button_set_value (GtkSpinButton *spin_button,gdouble value);
形參:spin_button --微調(diào)按鈕控件
value-- 要設(shè)置的數(shù)值
- 獲取按鈕當(dāng)前數(shù)值:
/*以整數(shù)方式獲取當(dāng)前按鈕數(shù)值*/
gdouble gtk_spin_button_get_value ( GtkSpinButton *spin_button );
/*以小數(shù)方式獲取當(dāng)前按鈕數(shù)值*/
gint gtk_spin_button_get_value_as_int( GtkSpinButton *spin_button );
- 以當(dāng)前值為基準(zhǔn)修改微調(diào)按鈕數(shù)值:
void gtk_spin_button_spin( GtkSpinButton *spin_button,GtkSpinType direction,gdouble increment );
形參:spin_button --微調(diào)按鈕控件
direction 取以下參數(shù):
GTK_SPIN_STEP_FORWARD
GTK_SPIN_STEP_BACKWARD
GTK_SPIN_PAGE_FORWARD
GTK_SPIN_PAGE_BACKWARD
GTK_SPIN_HOME
GTK_SPIN_END
GTK_SPIN_USER_DEFINED
? GTK_SPIN_STEP_FORWARD和GTK_SPIN_STEP_BACKWARD將構(gòu)件的值按increment參數(shù)指定的數(shù)值增大或減小,除非increment參數(shù)是 0。這種情況下,構(gòu)件的值將按與其相關(guān)聯(lián)的調(diào)整對(duì)象的step_increment值改變。
GTK_SPIN_PAGE_FORWARD和GTK_SPIN_PAGE_BACKWARD只是簡(jiǎn)單地按increment參數(shù)改變微調(diào)按鈕構(gòu)件的值。
GTK_SPIN_HOME 將構(gòu)件的值設(shè)置為相關(guān)聯(lián)調(diào)整對(duì)象的范圍的最小值。
GTK_SPIN_END 將構(gòu)件的值設(shè)置為相關(guān)聯(lián)調(diào)整對(duì)象的范圍的最大值。
GTK_SPIN_USER_DEFINED簡(jiǎn)單地按指定的數(shù)值改變構(gòu)件的數(shù)值。
- 限制微調(diào)按鈕構(gòu)件的文本框只能輸入數(shù)值:
void gtk_spin_button_set_numeric (GtkSpinButton *spin_button,gboolean numeric)
形參:spin_button --微調(diào)按鈕控件
numeric --TRUE 只能輸入數(shù)字;FALSE 可以輸入任意內(nèi)容
- 設(shè)置讓微調(diào)按鈕構(gòu)件在upper和lower之間循環(huán):
void gtk_spin_button_set_wrap (GtkSpinButton *spin_button, gboolean wrap)
形參:spin_button --微調(diào)按鈕控件
wrap --TRUE 當(dāng)按鈕值到達(dá)最小值再往下調(diào)整將變?yōu)樽畲笾?;最大值再往上調(diào)整將為最小值
FALSE 當(dāng)按鈕值到達(dá)最小值再往下調(diào)整將保持不變;最大值再往上調(diào)整保持不變
??可以設(shè)置讓微調(diào)按鈕構(gòu)件將其值圓整到最接近 step_increment 的值(在該微調(diào)按鈕構(gòu)件使用的調(diào)整對(duì)象中設(shè)置的)。用下面的函數(shù)實(shí)現(xiàn):
void gtk_spin_button_set_snap_to_ticks( GtkSpinButton *spin_button,gboolean snap_to_ticks );
- 微調(diào)按鈕構(gòu)件的更新方式可以用下面的函數(shù)改變:
void gtk_spin_button_set_update_policy( GtkSpinButton*spin_button,GtkSpinButtonUpdatePolicy policy );
形參:spin_button --微調(diào)按鈕控件
policy --可以取如下值:
GTK_UPDATE_ALWAYS
GTK_UPDATE_IF_VALID。
??在GTK_UPDATE_IF_VALID方式下,微調(diào)按鈕構(gòu)件只有在輸入文本是其調(diào)整對(duì)象指定范圍你合法的值時(shí)才進(jìn)行更新,否則文本會(huì)被重置為當(dāng)前的值。
??在GTK_UPDATE_ALWAYS方式下,我們將忽略在文本轉(zhuǎn)換為數(shù)值時(shí)的錯(cuò)誤。
- 更新微調(diào)按鈕:
void gtk_spin_button_update( GtkSpinButton *spin_button );
3.微調(diào)按鈕示例

??本示例實(shí)現(xiàn)共能如下:
- 通過微調(diào)按鈕數(shù)值日期(年、月、日);
- 通過復(fù)選按鈕選擇微調(diào)按鈕僅能輸入數(shù)字;
- 設(shè)置數(shù)值的小數(shù)位數(shù)
- 退出按鈕通過對(duì)話框提示是否退出,保存按鈕提示保存成功;
#include
#include
/*微調(diào)按鈕回調(diào)函數(shù)*/
void spin_button_callback(GtkWidget *widget,gpointer data)
{
GtkWidget *spinbutton=(GtkWidget *)data;
int val;
/*獲取當(dāng)前微調(diào)按鈕的值*/
val=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
g_print("val=%dn",val);
/*修改小數(shù)位數(shù)*/
gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinbutton),val);
}
/*復(fù)選按鈕處理函數(shù)*/
void check_button_callback(GtkWidget *widget,gpointer data)
{
GtkWidget *spinbutton=(GtkWidget *)data;
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
{
/*設(shè)置微調(diào)按鈕只能輸入數(shù)字*/
gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spinbutton),TRUE);
}
else
{
/*設(shè)置微調(diào)按鈕可以輸入任意內(nèi)容*/
gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spinbutton),FALSE);
}
}
/*保存按鈕處理函數(shù)*/
void save_button_callback(GtkWidget *widget,gpointer data)
{
g_print("保存n");
GtkWidget *window=(GtkWidget *)data;
GtkWidget *dialog;
GtkWidget *label;
dialog=gtk_dialog_new_with_buttons("保存", GTK_WINDOW(window),GTK_DIALOG_MODAL,NULL);
gtk_window_set_default_size(GTK_WINDOW(dialog),100, 100);
label=gtk_label_new("保存成功n");
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),label,TRUE, TRUE,0);
gtk_widget_show(label);
gtk_widget_show(dialog);
}
GtkWidget *dialog;
/*對(duì)話框處理回調(diào)函數(shù)*/
void button_clicked_callback(GtkWidget *widget,gpointer data)
{
char *pada=(gchar *)data;
if(!strcmp(pada,"on"))
{
gtk_widget_destroy(dialog);//關(guān)閉對(duì)話框
}
if(!strcmp(pada,"ok"))
{
gtk_main_quit();
}
}
/*退出按鈕處理函數(shù)*/
void quit_button_callback(GtkWidget *widget,gpointer data)
{
g_print("退出n");
GtkWidget *window=(GtkWidget *)data;
GtkWidget *label;
GtkWidget *table;
GtkWidget *button;
dialog=gtk_dialog_new_with_buttons("是否退出", GTK_WINDOW(window),GTK_DIALOG_MODAL,NULL);
gtk_window_set_default_size(GTK_WINDOW(dialog),100, 100);
label=gtk_label_new("是否退出");
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),label,TRUE, TRUE,0);
gtk_widget_show(label);
/*創(chuàng)建組裝表*/
table=gtk_table_new(1,0,FALSE);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area),table,FALSE, FALSE, 0);
gtk_widget_show(table);
/*創(chuàng)建按鈕*/
button=gtk_button_new_from_stock(GTK_STOCK_NO);
gtk_table_attach_defaults(GTK_TABLE(table),button,0,1,0,1);
gtk_widget_show(button);
g_signal_connect(GTK_OBJECT(button),"clicked",G_CALLBACK(button_clicked_callback),"on");
/*創(chuàng)建按鈕*/
button=gtk_button_new_from_stock(GTK_STOCK_OK);
gtk_table_attach_defaults(GTK_TABLE(table),button,1,2,0,1);
g_signal_connect(GTK_OBJECT(button),"clicked",G_CALLBACK(button_clicked_callback),"ok");
gtk_widget_show(button);
gtk_widget_show(dialog);
}
int main(int argc,char *argv[])
{
GtkWidget *window;
GtkWidget *vbox,*box;
GtkWidget *frame;
GtkAdjustment *adjust;
GtkWidget *table;
GtkWidget *label;
GtkWidget *spin_button,*spin_val_button;
GtkWidget *check_button;
GtkWidget *button;
gtk_init(&argc,&argv);
window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "微調(diào)按鈕");
gtk_window_set_default_size(GTK_WINDOW(window),320, 240);
gtk_container_set_border_width(GTK_CONTAINER(window) ,5);
g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
/*創(chuàng)建縱向盒*/
vbox=gtk_vbox_new(FALSE,0);
gtk_container_set_border_width(GTK_CONTAINER(vbox) ,2);
gtk_container_add(GTK_CONTAINER(window),vbox);
gtk_widget_show(vbox);
/*創(chuàng)建框架構(gòu)件*/
frame=gtk_frame_new("日期設(shè)置");
gtk_frame_set_label_align(GTK_FRAME(frame),1.0,0.5);
/*設(shè)置框架構(gòu)件風(fēng)格*/
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_OUT);
gtk_box_pack_start(GTK_BOX(vbox),frame, FALSE,TRUE,0);
gtk_widget_show(frame);
/*創(chuàng)建組裝表*/
table=gtk_table_new(2,3,FALSE);
gtk_container_add(GTK_CONTAINER(frame),table);
/*設(shè)置列之間的間隔*/
gtk_table_set_col_spacings(GTK_TABLE(table),20);
gtk_widget_show(table);
/*創(chuàng)建調(diào)整對(duì)象*/
adjust=(GtkAdjustment *)gtk_adjustment_new(2022,1970,3000,1,1,0);
/*創(chuàng)建微調(diào)按鈕*/
spin_button=gtk_spin_button_new(adjust,0.5, 0);
/*限制微調(diào)按鈕只能輸入數(shù)值*/
gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin_button),TRUE);
/*設(shè)置按鈕達(dá)到最大值后再變?yōu)樽钚≈?/
gtk_spin_button_set_wrap (GTK_SPIN_BUTTON(spin_button), TRUE);
gtk_table_attach_defaults (GTK_TABLE(table),spin_button,0,1,1,2);
gtk_widget_show(spin_button);
/*設(shè)置標(biāo)簽*/
label=gtk_label_new("年");
gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,0,1);
gtk_widget_show(label);
/*創(chuàng)建微調(diào)按鈕*/
adjust=(GtkAdjustment *)gtk_adjustment_new(1,1,12,1,1,0);
spin_button=gtk_spin_button_new(adjust,1, 0);
gtk_spin_button_set_wrap (GTK_SPIN_BUTTON(spin_button), TRUE);
gtk_table_attach_defaults (GTK_TABLE(table),spin_button,1,2,1,2);
gtk_widget_show(spin_button);
/*設(shè)置標(biāo)簽*/
label=gtk_label_new("月");
gtk_table_attach_defaults(GTK_TABLE(table),label,1,2,0,1);
gtk_widget_show(label);
/*創(chuàng)建微調(diào)按鈕*/
adjust=(GtkAdjustment *)gtk_adjustment_new(1,1,31,1,1,0);
spin_button=gtk_spin_button_new(adjust,0.5, 0);
gtk_spin_button_set_wrap (GTK_SPIN_BUTTON(spin_button), TRUE);
gtk_table_attach_defaults (GTK_TABLE(table),spin_button,2,3,1,2);
gtk_widget_show(spin_button);
/*設(shè)置標(biāo)簽*/
label=gtk_label_new("日");
gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,0,1);
gtk_widget_show(label);
/*創(chuàng)建框架構(gòu)件*/
frame=gtk_frame_new("數(shù)值調(diào)整");
gtk_frame_set_label_align(GTK_FRAME(frame),0.5,0.5);
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_OUT);
gtk_box_pack_start(GTK_BOX(vbox),frame, FALSE,TRUE,0);
gtk_widget_show(frame);
/*創(chuàng)建縱向向盒*/
box=gtk_vbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(frame),box);
gtk_widget_show(box);
/*創(chuàng)建組裝表*/
table=gtk_table_new(2,2,FALSE);
gtk_box_pack_start(GTK_BOX(box),table,TRUE,TRUE,0);
/*設(shè)置列之間的間隔*/
gtk_table_set_col_spacings(GTK_TABLE(table),10);
gtk_widget_show(table);
/*創(chuàng)建調(diào)整對(duì)象*/
adjust=(GtkAdjustment *)gtk_adjustment_new(0,-5000,5000,0.5,0.5,0);
spin_val_button=gtk_spin_button_new(adjust,0.5, 2);
gtk_table_attach_defaults (GTK_TABLE(table),spin_val_button,0,1,1,2);
gtk_widget_show(spin_val_button);
/*設(shè)置標(biāo)簽*/
label=gtk_label_new("數(shù)值");
gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,0,1);
gtk_widget_show(label);
/*創(chuàng)建調(diào)整對(duì)象*/
adjust=(GtkAdjustment *)gtk_adjustment_new(2,0,6,1,1,0);
spin_button=gtk_spin_button_new(adjust,0.5, 0);
g_signal_connect(G_OBJECT(spin_button),"value_changed",G_CALLBACK(spin_button_callback), spin_val_button);
gtk_table_attach_defaults (GTK_TABLE(table),spin_button,1,2,1,2);
gtk_widget_show(spin_button);
/*設(shè)置標(biāo)簽*/
label=gtk_label_new("小數(shù)位數(shù)");
gtk_table_attach_defaults(GTK_TABLE(table),label,1,2,0,1);
gtk_widget_show(label);
/*創(chuàng)建復(fù)選按鈕*/
check_button=gtk_check_button_new_with_label("僅輸入數(shù)字");
gtk_box_pack_start(GTK_BOX(box),check_button,FALSE,FALSE,0);
g_signal_connect(G_OBJECT(check_button),"toggled",G_CALLBACK(check_button_callback), spin_button);
gtk_widget_show(check_button);
/*創(chuàng)建橫向盒*/
box=gtk_hbox_new(FALSE,0);
gtk_box_pack_start(GTK_BOX(vbox),box,TRUE,TRUE,0);
gtk_widget_show(box);
/*創(chuàng)建保存按鈕*/
button=gtk_button_new_with_label("退出");
gtk_box_pack_start(GTK_BOX(box),button,FALSE,FALSE,0);
g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(quit_button_callback),window);
gtk_widget_show(button);
/*創(chuàng)建保存按鈕*/
button=gtk_button_new_with_label("保存");
gtk_box_pack_end(GTK_BOX(box),button,FALSE,FALSE,0);
g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(save_button_callback),window);
gtk_widget_show(button);
gtk_widget_show(window);
gtk_main();
}
-
構(gòu)件
+關(guān)注
關(guān)注
0文章
14瀏覽量
7836
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
GTK+ 2.0 教程
GTK術(shù)語表
【PDF】GTK學(xué)習(xí)筆記
GTK---制作linux系統(tǒng)工具
LabVIEW設(shè)置粗調(diào)和微調(diào)按鈕
嵌入式硬件構(gòu)件與底層驅(qū)動(dòng)構(gòu)件
GTK應(yīng)用程序不顯示圖像如何解決?
基于python的GTK與VTL混合編程及應(yīng)用
基于GTK+的組合構(gòu)件設(shè)計(jì)

GTK之信號(hào)和回調(diào)函數(shù)

GTK構(gòu)件之雜項(xiàng)構(gòu)件

GTK構(gòu)件之雜項(xiàng)構(gòu)件(2)

GTK渲染攝像頭圖像數(shù)據(jù)
PyTorch教程14.2之微調(diào)

PyTorch教程16.7之自然語言推理:微調(diào)BERT

評(píng)論