0 Star 0 Fork 0

LysLee / GTKPlus

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
gtk.txt 47.34 KB
一键复制 编辑 原始数据 按行查看 历史
lixue 提交于 2021-09-10 20:13 . update
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234
----gdk scale---
https://developer.gnome.org/gtk3/stable/gtk-x11.html
https://blog.csdn.net/vanarrow/article/details/108893868
GDK_SCALE=2 放大整个应用窗口
GDK_DPI_SCALE=0.5 #?
echo export GDK_SCALE=2 >> ~/.xsessionrc
cho export QT_SCALE_FACTOR=2 >> ~/.xsessionrc
----FileChooserWidget----
GtkFileChooserWidget GTK_FILE_CHOOSER_WIDGET
gtk_file_chooser_widget_new(action)
action: GtkFileChooserAction
@return: GtkWidget*
--------接口--------
GtkFileChooser
GtkFileChooserEmbed
----Q/A-----
the return value of gtk_main_interation vs gtk_main_quit ?
----Gtk事件处理----
gtk_events_pending(void)
检查是否有任何事件等待处理
@return gboolean
gtk_main_iteration(void)
Runs a single iteration of the mainloop. block if no events until the new events
@return: gboolean, TRUE if gtk_main_quit() has been called for the innermost
mainloop
gtk_main_iteration_do(blocking)
Runs a single iteration of the mainloop. block if blocking and no events
blocking: gboolean
@return: gboolean
----Assistant----
向导控件(multipage dialog)
GtkAssistant GTK_ASSISTANT
gtk_assistant_new
gtk_assistant_append/insert_page
gtk_assistant_prepend_page
gtk_assistant_set_page_complete
gtk_assistant_set_forward_page_func
gtk_assistant_set_page_type
gtk_assistant_get_nth_page
gtk_assistant_set_page_title/header_image/side_image
--------函数----------
gtk_assistant_new(void)
@return: GtkAssistant*
gtk_assistant_append_page(assist, page)
assist: GtkAssistant*
page: GtkWidget*, 作为一个step展示的控件
@return: gint, the index of the page
gtk_assistant_insert_page(assist, page, pos)
pos: gint, start at 0
gtk_assistant_set_page_complete(assistant, page, complete)
设置某个页面是否完成
complete: gboolean
gtk_assistant_set_forward_page_func(assist, page_func, data, destroy_func)
Sets the page forwarding func
page_func: GtkAssistantPageFunc
gint (*GtkAssistantPageFunc) (gint current_page, gpointer data);
data: gpointer
destroy_func: GDestroyNotify
void (*GDestroyNotify) (gpointer data);
Specifies the type of function which is called when a data element is
destroyed. It is passed the pointer to the data element and should free
any memory and resources allocated for it
gtk_assistant_set_page_type(assist, page, type)
type: GtkAssistantPageType
GTK_ASSISTANT_PAGE_CONTENT: default, regular contents
INTRO: an introduction, only show forward
CONFIRM: confirm or deny the changes, show Back and
Aplly btns, for the latst page
SUMMARY: summary, only close btn, for the last page
PROGRESS: for a task which takes a long time, all
btns are disabled, and user is prevented from closing the assistent
gtk_assistant_get_nth_page(assist, page_num)
@return: GtkWidget*
page_num: gint
gtk_assistant_set_page_title(assist, page, title)
title: gchar const *title
gtk_assistant_set_page_header_image(assist, page, pixbuf)
pixbuf: GdkPixbuf*
--------信号-----------
apply: 当点击任意页面的Apply/Forward按钮后触发
cancel: 当点击任意页面的Cancel按钮点击后触发
close: 当最后一个页面的Close/Apply按钮点击后触发
prepare: Before making a new page visible, this signal is emitted so that you can do any
preparation work before it is visible to the user.
user_function (GtkAssistant *assistant, GtkWidget *page, gpointer user_data)
Eg: example/assistant.c
----ProressBar----
进度条
GtkProgressBar GTK_PROGRESS_BAR
gtk_progress_bar_new
gtk_progress_bar_set_fraction
gtk_progress_bar_set_text
gtk_progress_bar_pulse
gtk_progress_bar_set_pulse_step
---------函数------
gtk_progress_bar_new(void)
gtk_progress_bar_set_fraction(pbar, fraction)
设置进度条到指定百分比
pbar: GtkProgressBar*
fraction: gdouble
gtk_progress_bar_set_text(pbar, text)
设置进度条旁边显示的文字,默认进度百分比
text: gchar const *
gtk_progress_bar_pulse(pbar)
使进度条前进一小步
gtk_progress_bar_set_pulse_step(pbar, fraction)
设置每次pulse的步进值
fraction: gdouble
----Alignment----
GtkAlignment: 控制子控件大小和对齐
gtk_alignment_new(xlaign, yalign, xscale, yscale)
xalign: gfloat, the horizontal alignment of the child widget, from 0 (left)
to 1 (right).
yalign: gfloat, the vertical alignment of the child widget, from 0 (top) to
1 (bottom).
xscale: gfloat, the amount that the child widget expands horizontally to
fill up unused space, from 0 to 1. A value of 0 indicates that the child
widget should never expand. A value of 1 indicates that the child widget
will expand to fill all of the space allocated for the GtkAlignment.
yscale: gfloat, the amount that the child widget expands vertically.
gtk_container_add
----FontSelectionDialog----
GtkFontSelectionDialog, GTK_FONT_SELECTION_DIALOG
struct GtkFontSelectDialog {
GtkWidget *ok_button; //GTK_STOCK_OK
GtkWidget *apply_button; //GTK_STOCK_APPLY
GtkWidget *cancel_button; //GTK_STOCK_CANCEL
}
大小gtk_font_selection_dialog_new
gtk_font_selection_dialog_set_font_name
gtk_font_selection_dialog_get_font_name
gtk_font_selection_dialog_set_preview_text
--------函数-----
gtk_font_selection_dialog_new(title)
gtk_font_selection_dialog_set_font_name(dialog, font)
dialog: GtkFontSelectionDialog*
font: gchar const *, 字体描述字符, 参考Pango相关函数
gtk_font_selection_dialog_get_font_name(dialog)
@return: gchar *, need g_free, 字体描述字符串
----modify fg------
一些控件无法显示前景色(button)?
----Window----------
窗口
GtkWindow, GTK_WINDOW
gtk_window_new
gtk_window_set_title/resizable/default_size/gravitay/icon_from_file
gtk_window_move
gtk_window_set_transient_for(win, par) //设置窗口从属关系
gtk_window_set_modal(win, modal)
设置窗口为modal或者non-modal, modal窗口阻止用户和在同一应用内的其它窗口
non-modal窗口可以同时存在多个,modal窗口只能同时存在一个
win: GtkWindow*
modal: gboolean
gtk_window_set_transient_for(win, par)
指示窗口管理使win保持在par上方,同时默认相对par居中,但并不会强制抓取par聚焦
会被一些dialog函数调用
win: GtkWindow*
par: GtkWindow*
----Widget---------
常用gtk控件的基类
GtkWidget, GTK_WIDGET
gtk_widget_destroy/grab_focus/set_sensitive
gtk_widget_set_size_request
gtk_widget_set_name //可以被RC文件引用
gtk_widget_modify_fg //修改控件前景色
----------函数------------
gtk_widget_modify_fg(widget, state, color)
state: GtkStateType
GTK_STATE_NORMAL/ACTIVE
color: GdkColor const *
----颜色设定RGBA----
RGBA: Red-Green-Blue-Alpha
Alpha: 设置透明度(0: 不透明完全显示, 1: 透明)
----ColorSelection----
颜色选择控件
GtkColorSelection, GTK_COLOR_SELECTION
gtk_color_selection_set_has_opacity_control
gtk_color_selection_get/set_current_color/alpha
--------函数----
gtk_color_selection_set_has_opacity_control(colorsel, opa_ctl)
//设置是否显示颜色透明度调节控件
colorsel: GtkColorSelection*
opa_ctl: gboolean
gtk_color_selection_set_current_color(colorsel, color)
color: GdkColor const*
gtk_color_selection_set_current_alpha(colorsel, alpha)
alpha: guint16, 0-65535
gtk_color_selection_get_current_alpha(colorsel)
@return: guint16
gtk_color_selection_get_current_color(colorsel, color)
color: GdkColor*
----ColorSelectionDialog----
颜色选择对话框, 内嵌GtkColorSelection控件
GtkColorSelectionDialog, GTK_COLOR_SELECTION_DIALOG
struct GtkColorSelectionDialog {
GtkWidget *colorsel;
GtkWidget *ok_button;
GtkWidget *cancel_button;
GtkWidget *help_buuton;
};
gtk_color_selection_dialog_new(title)
----FileChooserDialog----
文件打开/创建对话框,内嵌GtkFileChooserWidget控件
GtkFileChooserDialog
gtk_file_chooser_dialog_new
gtk_file_chooser_get_filename //GtkFileChooser接口
gtk_dialog_run
gtk_widget_destroy
----------函数----------
gtk_file_chooser_dialog_new(title, win, action, first_btn_text, ...)
win: GtkWindow*
action: GtkFileChooserAction
first_button_text: gchar const *, stock/response对, 可多对,必须以NULL结束
----------接口------------
GtkFileChooser, GTK_FILE_CHOOSER
----quit/destroy/delete_event函数总结----
gtk_main_quit 函数会退出mainloop, 但不会销毁控件(?),除非整个程序退出
gtk_widget_destroy 可以销毁控件及其子控件,同时触发destroy信号但不会自动退出
mainloop,一般用于顶级窗口
"delete_event": delevt_event信号可以从窗口管理器触发,默认处理函数会销毁(同
gtk_widget_destory)控件,同时触发"destroy"信号
"destroy": 一般通过关联destroy信号调用gtk_main_quit退出
mainloop
Eg: example/quit.c
----AboutDialog-------
软件关于信息对话框
GtkAboutDialog GTK_ABOUT_DIALOG
gtk_about_dialog_new
gtk_about_dialog_set_logo/name/version/copyright/license/websit[_label]
gtk_about_dialog_set_comments/authors/documenters/translator_credits/artists
---------函数---------
gtk_about_dialog_set_logo(dialog, logo)
logo: GdkPixbuf*
gtk_about_dialog_set_version(dialog, ver)
ver: gchar const*
gtk_about_dialog_set_license(dialog, lic)
lic: gchar const*
gtk_about_dialog_set_copyright(dialog, copyright)
copyright: gchar const*
gtk_about_dialog_set_authors(dialog, authors)
authors: gchar const*[]
gtk_about_dialog_set_documenters(dialog, docmters)
docmters: gchar const*[], null end
gtk_about_dialog_set_artists(dialog, artists)
artists: gchar const*[], null end
---------主要数据----
名称, 版权, 版本, 许可证,作者,网址, documenters,artists, 翻译者
documenters: 应用文档作者
artists: 应用图片作者
translator_credits: 当前语言版本的翻译人员
----GdkPixbuf----
图片对象, 采用引用计数,允许用户通过指定shape和像素点构建图像,可复用
gdk_pixbuf_new_from_file
gdk_pixbuf_scale_simple
gtk_pixbuf_new_from_file_at_size
--------函数----------
gdk_pixbuf_new_from_file(filename, error)
error: GError**
gdk_pixbuf_scale_simple(bixbuf, width, height, interpolation)
//调整图片大小
pixbuf: GdkPixbuf const *
interpolation: GdkInterType, 插值(缩放)模式
GDK_INTERP_NEAREST //scaling larger size,最快,画质最差
TILES //
BILINEAR //速度和画质平衡, 首选
HYPER //最慢,画质最好
gtk_pixbuf_new_from_file_at_size(filename, width, height, error)
----GError-----
struct GError {
GQuark domain; //类型<NAMESPACE>_<MODULE>_<ERROR>
gchar *message; //信息
gint code; //错误返回值
//GDK_PIXBUF_ERROR_CORRUPT_IMAGE/INSUFFICIENT_MEMORY/BAD_OPTION
//GDK_PIXBUF_ERROR_UNKNOWN_TYPE/UNSUPPORTED_OPERATION/FALIED
};
<NAMESPACE>_<MODULE>_ERROR_FAILED //通用错误类型
g_clear_error
-----------函数-------
g_clear_error(err)
err: GError **
=> g_error_free(*err) && *err = NULL
g_error_free(err)
err: GError *
----MessageDialog-------------
提供四种消息对话框: 一般、错误、警告、提问
GtkMessageDialog
gtk_message_dialog_new
gtk_window_set_title// cast to window
gtk_message_dialog_new_with_markup
gtk_message_dialog_set_markup
gtk_message_dialog_set_format_secondary_text/markup
---------函数----------
gtk_message_dialog_new(par, flags, type, btns, msg_fmt, ...)
par: GtkWindow*
flags: GtkDialogFlags, 或并
type: GtkMessageType, message dialog 类型
GTK_MESSAGE_INFO/WARNING/QUESTION/ERROR/OTHER
btns: GtkButtonsType, 按钮类型和type对应
GTK_BUTTONS_OK/CLOSE/YES_NO/OK_CANCEL/CANCEL/NONE
msg_fmt: gchar const *
gtk_message_dialog_new_with_markup(par, flags, type, btns, msg_fmt, ...)
msg_fmt:gchar const *, 根据msg_fmt将其他参数格式化,同时转义其中的xml标记字符
gtk_message_dialog_set_markup(dialog, markup)
markup: gchar const *, markup string(Pango markup format)
gtk_message_dialog_set_format_secondary_text(dialog, msg_fmt, ...)
添加第二文本,第一文本自动加粗
gtk_message_dialog_set_format_secondary_markup(dialog, msg_fmt, ...)
添加第二文本(Pango markup format),第一文本自动加粗
----Dialog------
对话框
GtkDialog GTK_DIALOG
gtk_dialog_new_with_buttons
gtk_box_pack_start_defaults //dialog->vbox
gtk_dialog_new
gtk_dialog_add_button[s]
gtk_dialog_set_has_separator
gtk_widget_show_all //dialog必须手动显示
gtk_dialog_run
gtk_window_set_modal //gtk_dialog_run调用
gtk_image_new_from_stock //GtkImage
gtk_window_set_transient_for //called by gtk_dialog_new_with_buttons
---------函数----------
gtk_dialog_new_with_buttons(title, par, flags, first_button_text,
first_response_id, ...);
par: GtkWindow*, 父窗口
flags: GtkDialogFlags, Dialog类型, 可并用
GTK_DIALOG_MODAL: 强制对话框占用主窗口聚焦,直到关闭
GTK_DIALOG_DESTROY_WITH_PARENT: 和主窗口一并销毁
GTK_DIALOG_NO_SEPARATOR: no sparator
first_button_text: gchar const *, 必须以null结束
stock ID or text to go in first button, or NULL
first_response_id: gint, 和按钮成对 GTK_RESPONSE_OK...
最后必须以NULL参数结束
gtk_dialog_run(dialog)
单独为dialog创建一个新的mainloop, 会一直保持主窗口聚焦,直到接收到response
id或者用户关闭dialog。其内部会调用gtk_window_set_modal。
return: gint, 返回点击的按钮相应的标示ID
GTK_RESPONSE_NONE: 手动关闭
GTK_RESPONSE_ACCEPT/REJECT/OK/CANCEL/CLOSE
-----------信号----------
"response": 相关按钮点击后触发
callback(dialog, response_id, user_data)
---------子控件-----------------
vbox: 主子控件包含其它子控件
separator: 分割线(vbox pack end)
action_area: hbox(vbox pack end)
action_area 和 separator 通过pack_end函数添加到vbox,其它控件通过pack_start
函数添加,这样就可以保持在底端
----------数据结构--------
typedef struct {
GtkWidget *vbox;
GtkWidget *action_area; //hbox 都在vbox内
}GtkDialog;
Eg: ./example/exercise-5-1.c
-----Image--------
图片控件
GtkImage
gtk_image_new_from_stock/file/pixbuf
---------函数-----------
gtk_image_new_from_stock(stock_id, size)
stock_id: gchar const *
size: GtkIconSize
GTK_ICON_SIZE_INVALID/MENU/SMALL_TOOLBAR/BUTTON/DIALOG...
gtk_image_new_from_file(filename)
filename: gchar const *
gtk_image_new_from_pixbuf(pixbuf)
pixbuf: GdkPixbuf
----Font Button-----
字体选择按钮
GtkFontButton
gtk_font_button_new_with_font
pango_font_description_from_string //pango
gtk_widget_modify_font //widget
gtk_font_button_set_title
gtk_font_button_get_font_name //neither free or modify
gtk_font_button_set_use_font/size
-----------函数--------
gtk_font_button_new_with_font(font)
font: gchar const *
gtk_widget_modify_font(widget, font)
font: PangoFontDescription *
pango_font_description_from_string (font)
font: gchar const*, 字体描述信息
"[Family] [Style] [Size]": Sans Italic 12.5
Family: Sans/Serif/Arial
Style: Italic/Bold/Bold Italic
@return: PangoFontDescription *
gtk_font_button_get_font_name(btn)
@return: const gchar *, no free or modify
gtk_font_button_set_use_font(btn, use_font)
use_font: gboolean, 是否使用选中的字体渲染按钮标签,默认不渲染
gtk_font_button_set_use_size(btn, use_size)
use_size: gboolean, 是否使用选中的字体大小渲染按钮标签
-----------信号---------
"font-set": 选择好字体后触发
----Gtk 惯例----
控件生成函数的返回类型一般都是GtkWidget*, 在具体使用时,再进行类型转换
----File Chooser Button-----
文件选择按钮
GtkFileChooserButton GTK_FILE_CHOOSER_BUTTON?
gtk_file_chooser_button_new
gtk_file_chooser_set_current_folder
g_get_home_dir //glib function, no free
gtk_file_chooser_get_filename
gtk_file_chooser_add_filter
----------函数---------
gtk_file_chooser_button_new (title, action)
title: const gchar *
action: GtkFileChooserAction: 打开/保存 文件或目录
GTK_FILE_CHOOSER_ACTION_OPEN/SAVE/SELECT_FOLDER/CREATE_FOLDER
----------信号--------------
"selection_changed": 文件目录打开/选择完成时触发
--------接口-------------
GtkFileChooser: GTK_FILE_CHOOSER 文件选择接口
----接口-------------
GtkFileChooser: GTK_FILE_CHOOSER 文件选择接口
gtk_file_chooser_set_current_folder(chooser, filename)
chooser: GtkFileChooser*, GTK_FILE_CHOOSER, Glib接口类型
filename: gchar const*
gtk_file_chooser_get_filename(chooser)
@return: gchar *, need g_free
gtk_file_chooser_add_filter(chooser, filter)
filter: GtkFileFilter*
gtk_file_chooser_set_select_multiple(chooser, multi_select)
multi_select: gboolean
gtk_file_chooser_get_filenames(chooser)
@return: GSList *, 单链表指针(->next), ->data指针指向数据
g_slist_free(list), g_free(list->data)
Eg: ./example/file-chooser-button.c
----------信号--------
selection-changed:
-----FileFilter----
文件过滤器
GtkFileFilter
gtk_file_filter_new
gtk_file_filter_set_name
gtk_file_filter_add_pattern
gtk_file_filter_add_mime_type
----------函数---------
gtk_file_filter_set_name(filter, name); //用于区分多个filter
name: gchar const *
gtk_file_filter_add_pattern(filter, pattern); //使用文件名模式过滤
pattern: gchar const *, Eg: "*.txt"/"*"
gtk_filte_filter_add_mime_type(filter, mime_type); //使用mime类型过滤
mime_type: char const *
Eg: ./example/file-chooser-button.c
----ColorButton-------
颜色选择按钮
GtkColorButton GTK_COLOR_BUTTON
gdk_color_parse
gtk_color_button_new_with_color
gtk_color_button_set_title
gtk_color_button_get_color
gtk_widget_modify_fg //GtkWidget 函数
--------函数--------
gtk_color_button_with_color(color)
color: GdkColor*
gtk_color_button_get_color(color_btn, color)
color_btn: GtkColorButton *
color: GdkColor *
--------信号-----
color_set: 选好颜色时触发
--------GdkColor-----
struct GdkColor {
guint32 pixel; //一般无需修改
guint16 red;
guint16 green;
guint16 blue;
}GdkColor;
gdk_color_parse(color_set, color)
color_set: const gchar *, "#ffffff"
color: GdkColor*
@return: gboolean, 成功返回TRUE
----GtkStyle---
每个Gtk控件都包含一个GtkStyle指针
typedef struct {
GtkStyle *style;
GtkRequisition requisition;
GtkAllocation allocation;
GdkWindow *window;
GtkWidget *parent;
} GtkWidget;
GtkStyle:
typedef struct {
GdkColor fg[5], bg[5], light[5], dark[5], GdkColor mid[5], text[5],
base[5], text_aa[5], black, white;
GdkGC *fg_gc [5], *bg_gc [5], *light_gc[5], *dark_gc[5], *mid_gc[5],
*text_gc[5], *base_gc[5], *text_aa_gc[5];
GdkGC *black_gc, *white_gc;
} GtkStyle;
----------Widget State------
控件在每种状态下都会调整为相应的style,
GtkStateType
GTK_STATE_NORMAL //fg[NORMAL]
ACTIVE //a toggled is depressed, bg[ACTIVE]
PRELIGHT //when the mouse pointer is over the widget, light[PRELIGHT]
SELECTED //when its text has been selected, dark[SELECTED]
INSENSITIVE //deactived, insensitive, mid[INSENSITIVE]
----------Resource Files------
一种用户自定义的GtkStyle文件
gtk_rc_parse
gtk_widget_set_name //为特定控件命名,可已被rc文件引用
-----------函数----------
gtk_rc_parse(filename)
-----------RC 指令介绍-----------
# 使用#表示注释
style: 定义样式集合
style "widgets" {
10, 10, 10, 10 xthickenss = 2 #水平填充
}
#定义样式集合"buttons",继承"widgets"样式
style "buttons" = "widgets" {
GtkCheckButton::inner-border = {10, 10, 10, 10}
}
#指定特定列型某控件的属性
style "checks" = "buttons" {
GtkCheckButton::inicator-size = 25
}
class: 将特定样式应用到指定类控件
class "GtkWindow" style "widgets" #指明GtkWindow控件应用"widgets"样式集合
widget: 应用某个样式集合到符合某个名称模式的控件上
该名称只通过gtk_widget_set_name函数设定的名称
如果无批匹配的名称再尝试匹配控件类名称
//应用"buttons"样式到特定GtkButton控件
widget "MyWidget.*.GtkButton" style "buttons"
widget_class: 将指定样式应用到匹配特定class模式的集合中
widget_class "GtkWindow.*.GtkLabel" style "stylename"
include: 包含其他样式文件
module_path:
*pixmap_path
Eg: example/style/mystyle.c
和控件属性相关的文件
https://stackoverflow.com/questions/41072683/gtk-menuitem-size-small
主题/UI/Code
----gtk图标主题----
图标主题索引文件
/usr/share/icons/kylin-icon-theme/index.theme
[Icon Theme]
Name=kylin-icon-theme
Directories=8x8/emblems,16x16/panel #需要扫描的目录
# Panel
[16x16/panel] #目录图标说明
Context=Status
Size=16
Type=Fixed
更新图标主题缓存
gtk-update-icon-cache <icon_theme_path>
----Scale-----
滑动阀,继承自GtkRange
GtkScale GTK_SCALE
GtkHScale GtkVScale
gtk_hscale_new[_with_range]
gtk_scale_set_digits/value[_pos]
gtk_range_get/set_value
-----------函数---------
gtk_hscale_new(adj)
gtk_hscale_new_with_range(min, max, step_increment)
gtk_scale_set_value_pos(scale, pos)
pos: GtkPositionType GTK_POS_LEFT/RIGHT/TOP/BOTTOM
设定数值相对控件的显示位置
----------信号-----------
value-changed
----Range----
GtkRange GTK_RANGE
gtk_range_get_value
gtk_range_set_value
gtk_range_set_increments
----SpinButton------
GtkSpinButton GTK_SPIN_BUTTON
gtk_spin_button_new[_with_range]
gtk_spin_button_set_digits/value
gtk_spin_button_get_value
-----------函数------
gtk_spin_button_new(adj, climb_rate, digits)
climb_rage: gdouble, 递增比
digits: guint, 小数位数
gtk_spin_button_new_with_range(min_val, max_val, step_increment)
-----------信号--------
changed: all properties except value
value-changed: value changed
----Adjustment------
用于控制,调整GtkRange衍生的组件(spinbuttons, viewports, multiplewidgets)
GtkAdjusment GTK_ADJUSTMENT
gtk_adjustment_new(inital_value, lower_range, upper_range, step_increment
page_increment, page_size)
step_increment: gdouble, 步增值
page_increment: 翻页增值,一般大于step_increment
page_size: gdouble, page_increment or 0
默认返回GObject*
----Entry-----------
文本框(用户名、密码)
GtkEntry GTK_ENTRY
gtk_entry_new
gtk_entry_set_visibility/invisible_char/max_length/text
gtk_entry_get_text
------------函数-----------
gtk_entry_set_visibility(entry, visible)
gtk_entry_set_invisible_char(entry, ch)
gtk_entry_set_max_length(entry, max)
gtk_entry_set_text(entry, text)
gtk_entry_get_text(entry) //neither free or modify
---------接口-------
GtkEditable: 主要提供文本选择接口
----Editable(接口)--------
GtkEditable: 主要提供文本选择接口
gtk_editable_set_editable(GTK_EDITABBLE(entry), editable)
gtk_editable_insert/delete_text
gtk_editable_select_region
gtk_editable_delete_selection
gtk_editable_get_chars //
gtk_editable_cut/copy/paste_clipboard
---------函数-----------
gtk_editable_get_chars(editable, start_pos, end_pos)
start_pos: gint, 起始字符(不是字节)
@return: gchar*, need g_free()
gtk_editable_insert_text(editable, new_text, len, pos)
new_text: gchar const *
len: gint
pos: gint
gtk_editable_delete_text(editable, gint start_pos, gint end_pos)
gtk_editable_select_region(editable, start_pos, end_pos)
选中指定文本
gtk_editable_delete_selection(editable)
删除选中文本
gtk_editable_cut_clipboard(editable)
将选中文本剪切到clipboard
gtk_editable_paste_clipboard(editable)
将clipboard中的内容粘贴到光标所在位置
gtk_editable_copy_clipboard(editable)
复制选中文本到clipboard
---------信号--------
changed: emitted at the end of a single user-visible operation on the contents
of the GtkEditable. void callback(GtkEditable *eable, gpointer user_data)
delete-text:
insert-text:
----RadioButton----
单选按钮, 继承于CheckButton
GtkRadioButton GTK_RADIO_BUTTON
gtk_radio_button_new[_with_label/mnemonic][_from_widget]
----------函数----
gtk_radio_button_new(group)
group: GSList*, 可以为空
gtk_radio_button_new_with_label/mnemonic(group, label)
label: gchar cons *
gtk_radio_button_new_from_widget(group)
group: GtkRadionButton *
gtk_radio_button_new_with_label/mnemonic_from_widget(group, label)
label: gchar * const
----------信号-----
toggled: 选择状态改变时(一共两个都会触发)
-----CheckButton-------
多选框, 继承于ToggleButton
GtkCheckButton
gtk_check_button_new[_with_label/mnemonic]
----------信号--------
toggled: 当选中状态发生改变时
-----ToggleButton-----
用来表示active或者inactive两种状态
GtkToggleButton
gtk_toggle_button_new[_with_label/mnemonic]
gtk_toggle_button_set/get_active
gtk_widget_set_sensitive
----------信号-------
toggled: 当toggle-button转变状态时触发
toggled_cb(toggle_btn, gpointer data)
-----GtkWidgetFlags----
sensitivity 是Gtk控件的众多属性中的一个
GTK_WIDGET_[UN]SET_FLAGS(widget, flag)
flag: GtkWidgetFlags,枚举类型
GTK_TOPLEVEL/NO_WINDOW/REALIZED/MAPPED/VISIBLE/SENSITIVE
......
GTK_WIDGET_FLAGS(widget)
-----Stock Items------
图形和字符串对,常用来修饰菜单和按钮控件
gtk_button_new_from_stock(stock_id)
stock_id: gchar const *
GTK_STOCK_CLOSE "gtk-close"
GTK_STOCK_OK
......
----EventBox-----------
使不能接收GDK事件(button/key-perss/release-event...)的控件(GtkLabel)
变得可以接收,且信号(GDK_2BUTTON_PRESS)更加具体
GtkEventBox GTK_EVENT_BOX
gtk_event_box_new
gtk_event_box_set_above_child
gtk_widget_set/add_events
gtk_widget_realize
gdk_window_set_cursor
-----------函数-------
gtk_event_box_set_above_child(ebox, above_child)
above_child: gboolean, 如果为TRUE,则只有ebox接收并处理相关信号,
否则会先传递给相应的子控件,然后再向父层传递(这种情况下
只有子控件可以接收GdkEvent时才有区别)
如果只希望evbox处理相关事件,则可以设为TRUE
gtk_widget_set_events(widget, events)
events: gint, 事件ID
GDK_EXPOSURE_MASK
GDK_POINTER_MOTION[_HINT]_MASK
GDK_BUTTON[1/2/3]_MOTION_MASK
GDK_BUTTON_PRESS/RELEASE_MASK
GDK_KEY_PRESS/RELEASE_MASK
GDK_ENTER/LEAVE_NOTIFY_MASK
GDK_FOCUS_CHANGE_MASK
GDK_STRUCTURE_MASK
GDK_PROPERTY_CHANGE_MASK
GDK_VISIBILITY_NOTIFY_MASK
GDK_PROXIMITY_IN/OUT_MASK
GDK_SUBSTRUCTURE_MASK
GDK_SCROLL_MASK
GDK_ALL_EVENTS_MASK
//多数Gtk控件可通过gtk_widget_show自动唤醒,GtkEventBox需显式唤醒
gtk_widget_realize(widget)
widget必须添加为一个顶级控件的子控件,实例化 GtkEevntBox->windodw
//如果一个控件已经被Gtk+自动唤醒则需要使用该函数
gtk_wdiget_add_events(widget, events)
//创建一个鼠标句柄
gdk_cursor_new(cursor_type)
cursor_type: GdkCursorType
GDK_HAND1...
//设置GdkWindow鼠标样式
gdk_window_set_cursor(win, cursor)
win: GdkWindow * (GtkEevntBox->windodw)
cursor: GdkCursor*
eg: example/event-box.c
----Notebook控件-----
在一个窗口内通过换页来逐页显示一段内容(比如安装向导),可通过点击tab按钮换页
GtkNotebook GTK_NOTEBOOK
gtk_notebook_new
gtk_notebook_append/prepend/insert/remove/next/prev_page
gtk_notebook_set_scrollable/tab_pos/show_tabs/current_page
gtk_notebook_reorder_child
gtk_notebook_get_n_pages
gtk_notebook_get_current_page
----------函数--------
gtk_notebook_append/prepend_page(nbk, child, tlabel)
tlabel: GtkWidget
gtk_notebook_insert_page(nbt, child, tlabel, pos)
pos: gint, 插入位置(页码)
以上两个函数成功时返回插入位置
//设置tab相对page的位置
gtk_notebook_set_tab_pos(nbk, pos)
pos: GtkPositionType
GTK_POS_LEFT/RIGHT/TOP/BOTTOM
gtk_notebook_remove_page(nbk, page_number)
gtk_notebook_reorder_child(nbk, child, pos)
pos: gint, 新的位置
gtk_notebook_set_current_page(nbk, page_number)
----------信号--------
change-current-page: Notebook换页时
----从哪些方面了解一个Gtk控件------
1. Description
2. Object Hierarchy
3. ImplementedInterfaces //支持的接口
4. Properties
5. StyleProperties
6. Signals
其中1/2/3/4/6同样适用于任何GObject对象
----HandleBox控件---
子控件通过鼠标拖动可以游离于主窗口之外,也可以通过再次拖动归位。
GtkHandeleBox GTK_HANDEL_BOX
gtk_handle_box_new()
gtk_handle_box_set_shadow_type/handle_position/snap_edge
----------HandleBox 函数--------
gtk_handle_box_set_shadow_type(hdlbox, type)
type: GtkShadowType, 指定托柄相对子控件的位置
GTK_SHADOW_NONE
IN/OUT
ETCHED_IN/OUT
gtk_handle_box_set_handle_position(hdlbox, position)
position: GtkPositionType
GTK_POS_LEFT/RIGHT/TOP/BOTTOM
gtk_handle_box_set_snap_edge(hdlbox, edge)
edge: GtkPositionType
----Expander 控件---
折叠子控件,以容器方式添加子控件
GtkExpander GTK_EXPANDER
gtk_expander_new[_with_mnemonic]
gtk_expander_set_expanded/spacing
gtk_expander_set/get_label
--------Expander 函数-------
gtk_expander_set_spacing(expander, spacing)
spacing: gint, expander-label和子控件直接的填充大小
gtk_expander_set_label(expander, label)
label: gchar const*, expander三角符的label
--------Expander属性------
exanded: 是否展开
----Fixed 容器控件----
//以像素为单位固定子控件的位置
GtkFixed GTK_FIXED
gtk_fixed_new/put/move
----------Fixd 控件函数--------
gtk_fixed_put(fixed, child, x, y)
gtk_fixed_move(fixed, child, x_position, y_position)
----Table 控件----
允许横竖同时填充
GtkTable GTK_TABLE
gtk_table_new
gtk_table_attach[_defaults]
gtk_table_set_row/col_spacing[s]
gtk_table_resize/set_homogeneous
----Table 函数-----
gtk_table_new(rows, columns, homogeneous)
homogeneous: gboolean, 所有cell大小是否需要保持一致?
gtk_table_attach(table, child, left, right, top, bottom, xoptions, yoptions,
xpadding, ypadding);
child: GtkWidget
left/right/top/bottom: 控件所占矩形的边界(点坐标)
x/yoptions: GtkAttachOptions,可以取并
GTK_EXPAND: cell均分额外空间
SHRINK:
FILL: 子控件占满cell
x/ypadding: gunit, 子控件到cell边界的填充宽度
gtk_table_attach_defaults(table, child, left, right, top, bottom)
gtk_table_attach(table, child, left, right, top, bottom, GTK_EXPAND | GTK_FILL,
GTK_EXPAND | GTK_FILL, 0, 0);
//设定列间距
gtk_table_set_col_spacings(table, spacing)
//设定制定列的列间距
gtk_table_set_col_spcing(table, columnm spacing)
----面板控件-----
将窗口通过一条线分割为两部分,用户可自由拖动这条线
GtkPaned GTK_PANED
gtk_paned_add1/2 //1表示左/上方, 2表示右下/方
gtk_paned_pack1/2
gtk_paned_set_position
gtk_paned_get_position
GtkHPaned
gtk_hpaned_new
GtkVPaned
gtk_vpaned_new
----------Paned 函数------
gtk_paned_pack1(paned, child, resize, shrink)
paned: GtkPaned, child: GtkWidget
resize: gboolean, 子控件是否扩展当整个面板在调整时
shrink: gboolean, 子控件是否可以无限缩小
gtk_paned_set_position(paned, position) //调整分界线位置
position: gint, 以像素为单位相对于top/left
gtk_paned_add1(paned, label) = gtk_paned_pack1(paned, lable, FALSE, TRUE)
gtk_paned_add2(paned, label) = gtk_paned_pack1(paned, lable, TRUE, TRUE)
---------Paned 信号----
move-handle:
----容器控件-----
1. 装饰性容器: 从GtkBin派生出来的控件,给子控件添加一些基础功能
GtkHandleBox, GtkEventBox
GtkWindow: 使子控件可以至于顶级控件中
GtkFrame: 在自控件周围添加frame
GtkButton: 使子控件可点击
GtkExpander: 显示或隐藏子控件
2. 布局容器:对子控件进行布局
GtkBox, GtkPaned, GtkTable, GtkFixed, GtkNotebook
用户偏好(theme, font)---程序指定---内建指令
GtkBox
3. 容器信号
add: 添加子控件时
check_resize: when checking whether it needs to resize for its children
before taking further action.
remove: 剔除子控件时
set_focus_child: 子控件获得focus时
----盒子控件----
GtkBox GTK_BOX
gtk_box_pack_start[_defaults]
gtk_boxt_pack_end[_defaults]
gtk_box_reorder_child
GtkVBox gtk_vbox_new
GtkHBox gtk_hbox_new
-------------盒子填充函数详解-------
gtk_vbox_new(homogeneous, spacing)
homogeneous: gboolean, cell是否完全一致
spacing: gint //竖直方向上各cell之间的空白宽度 ?
gtk_box_pack_start(box, child, expand, fill, padding)
https://www.cnblogs.com/super119/archive/2011/04/05/2005634.html
//GtkBox会根据子控件的个数将整个盒子逻辑上均匀的分为相应的cell,
//再将子控件填充到相应的cell里,cell可以根据控件个数动态调整。
exapnd 和 fill只影响hbox的水平方向或者vbox的竖直方向
box: GtkBox
child: GtkWidget button...
expand: gboolean cell是否扩展,homogeneous为真时始终扩展
fill: gboolean 子控件是否自动扩展,expand为否时始终无法扩增
padding: guint cell到子控件的填充宽度?
gtk_box_pack_start_defaults(box, child)
gtk_box_pack_start(box, child, TRUE, TRUE, 0)
void gtk_box_reorder_child (box, child, position);
//找到子控件,平移相关控件直到目标位置为空,用子控件填充
box: GtkBox
child: GtkWidget (button....)
position: gint 0 as first from start/end, -1 as last
-----------控件大小相关属性-----------
GtkRequisition gtk_widget_set_size_request #优先使用
GtkAllocation gtk_widget_size_allocate ?
----------GtkBin----
gtk_bin_get_child
----控件属性(基于GObject)------------
g_object_get //获取对象的属性值
g_object_set
---------属性监控-----
可以利用notity信号监控控件的任意属性是否发生改变:
notify::property-name, 属性名只能用dash连接
void property_changed_call_back(obj, property, data);
property: GParamSpec*
data: gpointer
--------对象数据------
属性不必预先定义,如果已经有同名关键自则会覆盖
void g_object_set_data (obj, key, data);
obj: GObject*
key: gchar const *key
data: gpointer
g_object_get_data(obj, key)
@return: gpointer
Eg:
g_object_set_data(G_OBJECT(ali), "pbar", (gpointer)pbar)
pbar = GTK_WIDGET(g_object_get_data(G_OBJECT(ali), "pbar"))
----Pango markup language----
https://developer.gnome.org/pygtk/stable/pango-markup-language.html
<span></span>
g_markup_printf_escaped
----GTK Stock----
Stock Items — Prebuilt common menu/toolbar items and corresponding icons
----GTK+ 对话框---
继承于窗口,可以显示一段信息,同时添加多个按钮,并为每个按钮指定一个ResponseID,当点击某个按钮时返回相应的ID
------------消息对话框-----
https://www.cnblogs.com/bobo1223/p/7287498.html
主流程(一般在一个回调函数内完成)
1. 新建dialog gtk_message_dialog_new
2. 设置dialog属性 gtk_window_set_title
3. 运行dialog gtk_dialog_run
4. 根据返回的ResponseId 处理内部逻辑
5. 销毁dialog gtk_widget_destroy
GtkWidget *gtk_message_dialog_new(par, flags, mtype, btype, mfmt, ...);
par: GtkWindow*, 父窗口
flags: GtkDialogFlags
GTK_DIALOG_MODAL: 对话框始终保持在父窗口的上部,直到关闭,防止父窗口交互
GTK_DIALOG_DESTROY_WITH_PARENT: 父窗口销毁,对话框也销毁
GTK_DIALOG_NO_SEPARATOR: 不显示分割线
mtype: GtkMessageType
GTK_MESSAGE_INFO/WARNING/QUESTION/ERROR/OTHER
btype: GtkButtongsType
GTK_BUTTONS_NONE GTK_BUTTONS_OK GTK_BUTTONS_CLOSE
GTK_BUTTONS_CANCEL GTK_BUTTONS_YES_NO GTK_BUTTONS_OK_CANCEL
mfmt: format of msg
gint gtk_dialog_run (GtkDialog *dialog);
返回值为ResponseID:
GTK_RESPONSE_NONE/REJECT/ACCEPT/DELETE_EVENT/OK/CANCEL/CLOSE/YES/NO
APPLY/HELP
----常用控件----
容器: GtkContainer GTK_CONTAINER
gtk_container_add
gtk_container_set_border_width
按钮: GtkButton GTK_BUTTON
gtk_button_new
gtk_button_new_with_label
gtk_button_new_with_mnemonic //创建支持快捷建的按钮
gtk_button_set_relief //设置边框属性
gtk_button_get/set_label
标签: GtkLabel GTK_LABEL
gtk_label_new
gtk_label_set_selectable/text/markup/markup_with_mnemonic
gtk_lalbel_get_text
对话框: 提示、警告、错误、问题
----------具体函数说明----------
gtk_window_set_gravity(win, gravity)
gravity: GdkGravity
GDK_RAVITY_NORTH/WEST/EAST/SOUTH/CENTER/STATIC/NORTH_WEST/NORTH_EAST
SOUTH_EAST/SOUTH_WEST
gtk_button_set_relief(btn, relief) //为按钮添加修饰性边框
relief: GtkReliefStyle
GTK_RELIEF_NORMAL/NONE/HALF
gtk_widget_set_size_request(widget, width, height)
width/height: 0: 尽可能小,-1: unset/normal-size
----GTK常规回调函数形式---
call_back(GtkWidget*, gpointer);
event(GtkWidget*, GdkEvent[Key/Button...] *event, gpointer)
void property_changed_call_back(GObject, GParamSpec*, gpointer);
G_CALLBACK(callback)
----常见信号------
"signal/signal_name/signal-name"
delete_event: 关闭窗口时触发
key_press_event: 键盘接收到按键
destroy: 当delete_event回调函数返回False时或者调用g_widget_destroy触发
clicked: 点击
button_press_event: EventBox Press 信号
---------事件处理相关函数---------
gtk_events_pending
gtk_main_iteration: 处理事件队列中的一个
----GdkEvent-------
GdkEvent: 是一个联合体(union)
具体可以是GdkEventKey/Button 等结构体(struct),可以通过GdkEventType来判断
----------GdkEventKey-----
https://stackoverflow.com/questions/10134956/in-simple-gtk-key-press-event-example-gdk-shift-mask-seems-to-be-ignored
typedef struct {
GdkEventType type; //GDK_KEY_PRESS or GDK_KEY_RELEASE
GdkWindow *window; //the window that received the event
gint8 send_event; //TRUE if event used XSendEvent
guint32 time; //The length of the event in milliseconds
guint state; //The state of Control, Shift and Alt
//GDK_CONTROL/SHIFT_MASK
guint keyval; //The key that was pressed <gdk/gdkkeysyms.h>
//GDK_KEY_S/s
gint length; //The length of string?
gchar *string; //?
guint16 hardware_keycode; //Raw code of the key that was pressed or released
guint8 group; ?
guint is_modifier : 1; ?
} GdkEventKey;
type 是所有事件都具备的成员
-----GdkEventType-----
枚举类型: 用于判断事件类型
GDK_NOTHING/DELETE/DESTROY/EXPOSE/MOTION_NOTIFY/[23]BUTTON_PRESS
GDK_KEY_PRESS/RELASE GDK_ENTER/LEAVE_NOTITY GDK_FOCUS_CHANGE
GDK_CONFIGURE GDK_[UN]MAP GDK_PROPERTY_NOTIFY GDK_SELECTION_CLEAR/REQUEST/NOTIFY
GDK_PROXIMITY_IN/OUT GDK_DRAG_BEGIN/REQUEST/ENTER/LEAVE/DATA_AVAIL
GDK_CLIENT_EVENT GDK_VISIBILITY_NOTIFY GDK_NO_EXPOSE GDK_OTHER_EVENT
---------信号函数-----
g_signal_emit_by_name
g_signal_stop_emission_by_name: 停止后续回调函数的调用
//instaance, data 传递给call_back
g_signal_connect(instance, detailed_signal, c_handler, data)
//可以将data, instance传递给call_back
g_signal_connect_swapped(instance, detailed_signal, c_handler, data)
----GtkWidget 继承树-----
GObject
GInitiallyUnowned
GtkObject
GtkWidget
GtkProgressBar
GtkAssistant
GtkEntry
GtkSearchEntry
GtkSpinButton
GtkRange
GtkScale
GtkHScale
GtkVScale
GtkMisc
GtkLabel
GtkImage
GtkContainer
GtkFixed
GtkTable
GtkPaned
GtkHPaned
GtkVPaned
GtkBox
GtkFileChooserWidget
GtkVBox
GtkColorSelection
GtkHBox
GtkFileChooserButton
GtkBin
GtkAlignment
GtkButton
GtkToggleButton
GtkCheckButton
GtkRadioButton
GtkColorButton
GtkFontButton
GtkLinkButton
GtkLockButton
GtkModelButton
GtkScaleButton
GtkFontButton
GtkHandleBox
GtkWindow
GtkExpander
GtkDialog
GtkMessageDialog
GtkAboutDialog
GOject: 基类,G_OBJECT(obj)
GInitiallyUnowned: floating reference, private
GtkOjbect: Gtk Object基类GTK_OBJECT(obj)
GtkWidget: GTK widget基类GTK_WIDGET(obj)
GtkContainer: 控件容器GTK_WIDGET(obj)
GtkBin: 特殊组建容器:只能包含一个子控件GTK——CONTAINER(obj)
GtkWindow: 窗口组建GTK_WINDOW(obj)
----GTK+程序基本框架/流程------
---------2.0--------
1. 初始化: gtk_init
获取gdk display,准备glib主循环和信号处理
gdk_init, g_main_loop_new
gtk_init 可以提取并处理main函数中其可识别的参数
gtk_init_check: 如果图形环境初始化失败则返回False
2. 创建主窗口 gtk_window_new
GTK_WINDOW_TOPLEVEL:将窗口大小、位置、边框委托窗口管理器进行管理
GTK_WINDOW_POPUP: 菜单、tooltip(提示窗口)
3. 设置主窗口属性(标题)
gtk_window_set_title
gtk_window_set_decorated:可以关闭窗口管理器对窗口本身的影响
4. 添加控件、关联回调函数
gtk_xxx_new, gtk_container_add, g_signal_connect[_swapped]
5. 默认显示所有窗口及控件 gtk_widget_show[_all]
gtk_widget_hide[_all]
6. 执行主函数 gtk_main
gtk_main_quit
--------3.0---------
1. 创建应用程序实例 gtk_application_new
2. 关联app实例和主回调函数 g_singal_connect
主回调函数: static void(GtkApplication *app, gpointer user_data);
1. 创建应用主窗口 gtk_application_window_new
2. 设置主窗口属性 gtk_window_set_xxx
3. 添加控件,关联回调函数
4. 默认显示所有窗口及控件 gtk_widget_show_all
3. 运行app实例
4. 销毁app
----设计结构----
GTK+: 控件,布局
GLib: 基础库,常用函数、数据结构、文件管理、管道、多线程
GObject: 面向对象、信号、属性
GDK: 图形库: 对Xlib底层函数的封装
Cairo: 2D矢量图渲染
GdkPixbuf: (Xclient端)图片操作库,替换Imlib
Pango: 控制文本和字体通过Cairo/Xft
ATK: 访问助手工具套件(屏幕阅读器),使GTK控件更易于使用
----------------Old-------------------------------------
官网:https://www.gtk.org/
教程:https://www.cnblogs.com/rain-blog/p/gtk3-1.html
1.安装
Centos7:
yum -y install gtk3.x86_64 gtk3-devel.x86_64
查看版本:
pkg-config --modversion gtk+-3.0
2.编译
gcc example.c `pkg-config --cflags --libs gtk+-3.0`
pkg-config:可用于列举出某个库的相关信息,比如此库的路径、相关头文件路径等
常用参数:
--list-all 列出所有已安装的共享库
--cflags 列出指定共享库的预处理和编译flag。
--libs 列出指定共享库的链接flag。
gtk+-3.0 选项作用为指定GTK版本。
原理:库文件编译完成后,会在{installed_home/lib/}下生成产生一个名为pkgconfig的目录,内含该链接库的.pc文件,此文件记录了改库的相关信息。为了能被查找读取到,需要将该.pc文件安装到 /usr/lib/pkgconfig/ 目录中,或在PKG_CONFIG_PATH环境变量中加入该.pc文件的安装路径
URL:https://blog.csdn.net/bryce_xiao/article/details/70787810
3.常用函数
URL:https://www.cnblogs.com/rain-blog/p/gtk3-1.html
GtkApplication *gtk_application_new (const gchar *application_id, //Special char as Id
GApplicationFlags flags); //创建一个application
GApplicationFlags:G_APPLICATION_FLAGS_NONE
GtkWidget *gtk_application_window_new(GtkApplication *app);//声明一个窗口
gtk_window_set_title(GTK_WINDOW(window), "Application"); //设置窗口标题
gtk_window_set_default_size(GTK_WINDOW(window), 400, 400); //设置窗口大小
gtk_widget_show_all(GtkWidget *window); //显示窗口
gulong g_signal_connect(gpointer *object, //发出信号的控件
const gchar *name, //信号名称
GCallback func, //回调函数(对信号要采取的动作)
gpointer data); //传给回调函数的数据
//其对应的回调函数是:
void func( GtkWidget *widget, //发出信号的控件
gpointer callback_data); //传过来的数据
#define g_signal_connect(instance, detailed_signal, c_handler, data) \
g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
gulong g_signal_connect_data (gpointer instance, //发出信号的控件
const gchar *detailed_signal, //信号名称
GCallback c_handler, //回调函数
gpointer data, //传给回调函数的数据
GClosureNotify destroy_data,
GConnectFlags connect_flags);
int g_application_run(G_APPLICATION(app), argc, argv); //运行app
_object_unref(app); //销毁app
-----------------------------
GTK+(GDK(Xlib)) ---> X Server
Glib: extern libc
GObject(GLib Object System): Class Gtype
GDK: GDK acts as the intermediary between Xlib and GTK+.
GdkPixbuf: library that provides client-side image manipulation functions
Pango:controls text and font output in conjunction
ATK:
-----------------------------------------------
gtk+-2.0
delete_event: 当关闭窗口时会触发该信号,相应的回调函数如果返回FALSE(默认)
则[销毁控件同gtk_widget_destroy]触发destory信号,如果返回true则不进行处理
destory信号: 用于自定义后台程序收尾工作,或者直接退出
gtk_widget_destroy() == emit destroy ?
---
g_signal_stop_emission_by_name ?
Events VS singals ?
---
Pango Text Attribute Markup Language
gtk_label_set_markup(GtkWidget *label, char *markup);
https://developer.gnome.org/pango/stable/PangoMarkupFormat.html
------
Callbak Functions
static void
callback_function (GtkWidget *widget,
... /* Other Possible Arguments */ ...,
gpointer data);
----------------------
void gtk_widget_grab_focus (GtkWidget *widget);
设置控件grab keyboard focus
void gtk_window_set_resizable (GtkWindow *window, gboolean resizable);
设置窗口是否可以重设大小
void gtk_window_set_default_size (GtkWindow *window, gint width, gint height);
高和宽特别值:
0: 尽可能小;-1: 常规值
void gtk_window_move (GtkWindow *window, gint x, gint y);
移动窗口位置
void gtk_window_set_gravity (GtkWindow *window, GdkGravity gravity);
指定窗口坐标原点?
North: Top, South: bottom, East: right, West: left
GDK_GRAVITY_NORTH_WEST: 默认值
GDK_GRAVITY_CENTER
GDK_GRAVITY_EAST: ?
GDK_GRAVITY_STATIC: ?
....
void gtk_window_set_transient_for(GtkWindow *window, GtkWindow *parent);
指定父窗口,用于子窗口居中,置顶
gboolean gtk_window_set_icon_from_file (GtkWindow *window,
const gchar *filename, GError **err);
指定任务栏和标题栏的图标
----------------------------------------
基于gtk+ 的GUI程序源码分析
界面字符通过po文件找到英文,原始英文有可能存在源码也可能存在glade布局文件里可先检索包含相应字符的源码,或者先找到包含该英文的glade文件再查找引用该布局文件的源码
----GTK主题配置-----
1、配置文件
https://coderwall.com/p/no3qfa/setting-gtk2-and-gtk3-theme-via-config-file
~/.gtkrc-2.0
~/.config/gtk-3.0/settings.ini
2、环境变量
https://www.linuxuprising.com/2019/10/how-to-use-different-gtk-3-theme-for.html
GTK_THEME=Yaru-dark gedit
---pygtk----
layout:
https://blog.csdn.net/a87b01c14/article/details/52072225
https://blog.csdn.net/deepfuture/article/details/84020852
C/C++
1
https://gitee.com/LysLee111/GTKPlus.git
git@gitee.com:LysLee111/GTKPlus.git
LysLee111
GTKPlus
GTKPlus
master

搜索帮助