转载!有关GTK开发的笔记[整理中]

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

1、关于窗口
 
    // 创建顶层窗体,后面有POPUP的
    GtkWidget *main_window;
    main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 
    // 设置title文字,注意UTF8格式的文字转换,否则是乱码
    gtk_window_set_title (GTK_WINDOW (main_window), g_locale_to_utf8("哈哈",-1,NULL,NULL,NULL));
 
    // 设置窗体图标,用这条语句使所有窗体使用同一个图标,也有独立设置(GTK手册)
    gtk_window_set_default_icon_from_file( ICON_WNDICON, NULL);
 
    // 设置边框宽度,基本随意
    gtk_container_set_border_width (GTK_CONTAINER (main_window), 8);
 
    // 设置模式窗口
    gtk_window_set_modal(GTK_WINDOW (window), TRUE);
 
    // 让窗口总在最前
    gtk_window_set_keep_above(GTK_WINDOW (window), TRUE);
 
    // 移动窗口位置
    gtk_window_move(GTK_WINDOW (window), left, top); 
    // 也是设置位置的,简单点
    gtk_window_set_position(GTK_WINDOW (main_window), GTK_WIN_POS_CENTER);
 
    // 这个让叉叉无效
    gtk_window_set_deletable(GTK_WINDOW (main_window), FALSE);
    设置全屏显示的几种办法:
    a)简单一点就用这个。
      gtk_window_maximize(GTK_WINDOW (main_window));
 
    b)下面这个有边框但都给挤到屏幕外面了
      gtk_window_fullscreen( GTK_WINDOW(main_window)); 
    c)采用设置窗体大小等于screen大小的办法,就是麻烦点
      GdkScreen *screen;

      screen = gtk_window_get_screen( GTK_WINDOW( main_window)); 
      gtk_window_set_default_size( GTK_WINDOW( main_window), 
      gdk_screen_get_width(screen), 
      gdk_screen_get_height(screen));
 
    让窗体尺寸不可调整,但是好像与全屏使用时有些问题,会自动地调整窗口的大小
      gtk_window_set_resizable(GTK_WINDOW(main_window),FALSE);
    或
      gtk_window_set_policy(GTK_WINDOW(main_window), FALSE, FALSE, TRUE);
 
    常用的信号:
    a)点击叉叉
      gint delete_event (GtkWidget *widget, GdkEvent *event, gpointer data)

      g_signal_connect (G_OBJECT (main_window), "delete_event", G_CALLBACK (delete_event), NULL);
 
    b)窗口变化,gboolean返回TRUE就行了,继续执行默认过程,同下
      gboolean window_state_event (GtkWidget *widget, GdkEventWindowState *event, gpointer user_data)
 
      g_signal_connect (G_OBJECT (main_window), "window_state_event", G_CALLBACK (window_state_event), main_window);
    c)点击别的窗口
      gboolean focus_out_event(GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
 
      gtk_signal_connect (GTK_OBJECT(window), "focus-out-event", GTK_SIGNAL_FUNC(popuptoolbar_fout_event), window); 
    POPUP窗口也不错,而且不会在任务栏出现。
    window = gtk_window_new(GTK_WINDOW_POPUP);
 
    用起来和这个差不多
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_decorated(GTK_WINDOW (window), FALSE);

    设置一个背景图片,对于整个窗体的,这还真需要点前期策划和艺术细胞,不然效果挺吓人。我还是喜欢后面的那一个办法。
    GdkPixbuf *pixbuf;
    GdkPixmap *pixmap;

    gtk_widget_set_app_paintable (main_window, TRUE);
    gtk_widget_realize (main_window);
    pixbuf = gdk_pixbuf_new_from_file (ICON_BGPIC, NULL);
    gdk_pixbuf_render_pixmap_and_mask (pixbuf, &pixmap, NULL, 128);
    gdk_window_set_back_pixmap (main_window->window, pixmap, FALSE);
    g_object_unref (pixbuf);
    g_object_unref (pixmap);
    对一部分区域设背景图,这个办法比较随意也简单,麻烦一点的地方是需要先做个计算,screen在前面有获得办法。
    同时有说到一个图片缩放的办法。
    GdkPixbuf *pixbuf;

    image = gtk_image_new_from_file (ICON_BGPIC);
    pixbuf = gtk_image_get_pixbuf (GTK_IMAGE(image));
    pixbuf = gdk_pixbuf_scale_simple(pixbuf, 
       gdk_screen_get_width(screen) - 16, // 16: window border SHIFT 
       gdk_screen_get_height(screen) - 140, // 140: height SHIFT
       GDK_INTERP_BILINEAR);
    gtk_image_set_from_pixbuf(GTK_IMAGE(image), pixbuf);
    // 我放到fixed里了,这个随便
    gtk_fixed_put(GTK_FIXED(fixed), image, 0, 0);
 
 
   2、关于按钮
 
    // 建立按钮
    GtkWidget * button;
    button = gtk_button_new ();
 
    // 简单一点的
    button = gtk_button_new_with_label ("XX");
 
    // 要产生那种能用键盘快捷键的按钮
    button = gtk_button_new_with_mnemonic(g_locale_to_utf8("确定(_O)", -1,NULL,NULL,NULL));
 
    // 要好看一点就用一个图片的
    // 函数产生一个hbox,然后把botton当作容器放进去,GTK的widget几乎都是容器,所以这个函数还是比较有用的,在产生toolbar的时候也用到。
    GtkWidget * create_imagetext_hbox(const char *text,const char *image_path)
    {
        GtkWidget *box;
        GtkWidget *label;
        GtkWidget *image;

        image = gtk_image_new_from_file (image_path);
        label = gtk_label_new (g_locale_to_utf8(text, -1,NULL,NULL,NULL));
        box = gtk_hbox_new (FALSE, 0);
        gtk_container_set_border_width (GTK_CONTAINER (box), 2);
        gtk_box_pack_start (GTK_BOX (box), image, FALSE, FALSE, 3);
        gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 3);
 
        gtk_widget_showall (box);
        return box;
    }
    GtkWidget * create_image_button(const char *text,const char *image_path)
    {
        GtkWidget * button;
        GtkWidget *box;
 
        box = create_imagetext_hbox(text, image_path);
 
        button = gtk_button_new ();
        gtk_container_add (GTK_CONTAINER (button), box);
        gtk_widget_show (button);
        return button;
    }
 
    // clicked信号定义
    void user_function (GtkButton *button, gpointer user_data)

 
   3、关于entry
 
    // 建立entry
    GtkWidget *entry;
    entry = gtk_entry_new ();
 
    // 让entry显示****
    gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE);
 
    // 让entry直接响应回车
    gtk_signal_connect (GTK_OBJECT(entry), "activate", GTK_SIGNAL_FUNC(enter_event), usrdata);
 
    // 读/写entry,读出的数据指针指向entry的widget内部,不能直接释放。
    gchar *gtk_entry_get_text (GTK_ENTRY (entry))
    gtk_entry_set_text (GTK_ENTRY (entry), "XX")
 
   4、关于label
    // 简单一点
    label = gtk_label_new("XX");
 
    // 让label接受键盘快捷键,并聚焦到某widget
    label = gtk_label_new_with_mnemonic (g_locale_to_utf8("输入(_I)", -1,NULL,NULL,NULL));
    gtk_label_set_mnemonic_widget (GTK_LABEL (label), widget);
 
    // 使用<span></span>控制显示
    gtk_label_set_markup(GTK_LABEL(label), <span background='red'>"XXXX"</span>);
    // -----------还有好多label用法,慢慢加
 
   5、BOX参数小记
    // 建立box
    box = gtk_hbox_new (gboolean homogeneous, gint spacing);
    或
    box = gtk_vbox_new (gboolean homogeneous, gint spacing);
 
    homogeneous:TRUE,内部widget平均分配box空间,Widget大小不变,只是占地大了,其他地方padding;一般用FALSE即可,是否平均可在pack指定的widget时进行控制。
    spacing:内部widget间的间隔,pixel单位。
 
    结合gtk_container_set_border_width (GTK_CONTAINER (box), 8);效果也不错。
 
    // Pack指定widget到box中
    gtk_box_pack_start (GtkBox *box, GtkWidget *child, gboolean expand, gboolean fill, guint padding);
    或
    gtk_box_pack_end (GTK_BOX (box), widget, FALSE, FALSE, 0);
 
    expand:TRUE,对所有TRUE参数打包进来的widget平均分配box中剩余的空间,但并不填充,仍保持widget原大小。
    fill:TRUE,只有在expand为TRUE时有效,widget改变大小填充满其在box中占有的空间。
    padding:widget与他后面的控件的间隔,pixel单位,最后一个widget将作为与box边缘的间隔。
 
    box其乐无穷呀!
 
   X、封装的代码
    虽然丧失了一定的随意性,但是平常也就这些应用了。
 
    X.1 treeview => LGX_storeview
 
    X.2 toolbar
 
    X.3 calendar
 
    X.4 inputdialog
 
 
   Y、Widget的一些常用方法
 
    Y.1、设定大小
      gtk_widget_set_usize(widget, x, y);
 
    Y.2、使其“变灰色”
      gtk_widget_set_sensitive(widget, FALSE);
 
  gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
 
PangoFontDescription *fontdesc;

fontdesc = pango_font_description_from_string("uming 15");
gtk_widget_modify_font(treeview, fontdesc);
pango_font_description_free(fontdesc);
 
fontdesc = pango_font_description_from_string("uming");
pango_font_description_set_size (font_desc, 12*PANGO_SCALE);
 
   Z、其他小技巧
 
    Z.1 获得widget的上下左右
      widget->allocation.x
      widget->allocation.y
      widget->allocation.height
      widget->allocation.width

2017年最棒的七个Python图形应用GUI开发框架 阅读详情

相关推荐

GTK】窗口停靠

源码: #include &lt;gdk/gdkcursor.h&gt; #include &lt;gtk/gtk.h&gt; #define TEST_W 100 #define TEST_H 80 gboolean drag = FALSE; // 只在左键按下时拖动窗体 gboolean hide = FALSE; // 只在左键按下时拖动窗体 int nX = 0; int ...

编程世界 244

GTK学习(3)-Lable、pixbuf、single、GtkEntry

添加标签 标签主要是显示文本信息,用作标志。 标签的创建: GtkWidget *gtk_label_new(const gchar *str); str:文本内容 返回值:标签指针 设置标签的内容: void gtk_label_set_text (GtkLabel *label, const gchar *str); label:操作的标...

上善若水 1191

GtkWindow — Toplevel which can contain other widgets

GtkWindow — Toplevel which can contain other widgets

突围 2078

GTK

模板 #include&lt;gtk/gtk.h&gt; int main(int argc,char *argv[])//头文件 { gtk_init(&amp;argc,&amp;argv);//初始化 //...... //我们所写的代码 //...... gtk_main();//主事件循环 return 0; } 头文件〈gtk/gtk....

高朗的博客 974

记录今天使用成功的GTK接口函数

1.  gtk_window_set_default_size(GTK_WINDOW(win->toplevel),1920,1047) 设置窗口大小(会适应性的改变) 2.  gtk_widget_set_usize(GTK_WINDOW(win->toplevel),1200,600);  设置窗口大小(固定大小,但是gtk3.0 好像已经没有了)   rerror:  undefin

yang.zhou欢迎各位 1131

【GitHub项目推荐--手写笔记软件】【转载

Rnote:手写笔记传统笔记软件要么功能臃肿,要么对触控笔支持鸡肋。而 Rnote 专为手写场景优化,目前在 GitHub 斩获 8.7K 的 Star!界面清爽无广告,却能实现这些硬核功能。① 压感笔触真实到哭:用触控笔写字画画,笔锋粗细随力度变化,仿佛在纸上挥毫。钢笔/荧光笔/形状工具一键切换,长按工具还能调粗细颜色。② PDF/SVG一键导入标注:课件、设计图拖进来直接圈重点,做批注比纸质还方便!多页笔记随意跳转,长文档整理超高效。

j8267643的博客 1461

gtk 鼠标事件

版权声明:本博客文章,大多是本人整理编写,或在网络中收集,转载请注明出处!! 鼠标事件,可以理解为操作鼠标的动作。对于窗口而言,用户操作鼠标,窗口检测到鼠标的操作( 产生一个信号 ),然后去做相应处理( 调用其规定的回调函数 ),即可认为是鼠标事件,还是信号与回调函数的知识点。 信号与回调函数的使用请点击此处。 窗口默认不接收鼠标的操作,需要手动添加让其接收。

dhrczgnxblws的博客 1331

GTK4】又快年底了,100行代码教你做一款简单的年会抽奖软件

文章目录自制一款简单的抽奖软件一、参与抽奖同事信息准备二、准备GTK4环境三、开始Coding3.1 读取抽奖同事信息 抽奖软件视频 自制一款简单的抽奖软件 一、参与抽奖同事信息准备 工号和姓名之间使用水平制表符分隔,每行只显示一个同事的信息。 二、准备GTK4环境 安装传送门 三、开始Coding 3.1 读取抽奖同事信息 我们首先创建一个单向循环链表,实现同事信息的记录。这里没有使

从善若水的博客 1860

GTK国际化

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33901843的博客 283

2018项目计划

安卓管理器: PC(C++ GTK) ANDROID(JAVA) LINUX软件管理器: PC(RUST/GTK) WEB(SERVER-RUST 前端-VUE) 内容(GIT) 将以前的项目整理一下 转载于:https://www.cnblogs.com/wsgalaxy/p/9742292.html...

weixin_30872867的博客 63

(转载)MinGW开发的经历感想和一些链接

MinGW开发的经历感想和一些链接<br />文章来源网络 属于c/c++ 分类 电脑编 程网整理 2010/8/4<br />上一篇: C++将对象写入二进制文件  <br /> 下一篇:ctgas 插件<br />简介:这是MinGW开发的经历感想和一些链接的详细页面, 介绍了和c/c++,C MinGW开发的经历感想和一些链接有关的知识,加入收藏请按键盘ctrl+D,谢谢大家的观看!要查看更多有关信息,请点击此处<br />所谓MinGW,就是gcc在windows平台上的port(所生成

wulong710的专栏 1898

linux设置密码报错automa,AutomaThemely:根据太阳日出及日落时间自动切换明暗的Gtk主题...

AutomaThemely 是一款根据太阳日出及日落时间自动切换明暗的 Gtk 主题,支持在 Ubuntu 18.04、16.04 等 Linux 桌面发行版本上安装,同时介绍它的使用方法。AutomaThemely简介AutomaThemely 是一个 Python 程序,它可以根据光亮和黑暗时间自动更改 Gnome 主题,如果你想在夜间使用黑暗的 Gtk 主题并在白天使用明亮的 Gtk 主题,...

weixin_33525298的博客 293

推荐跨平台笔记软件CherryTree

前两天看见UbuntuHome发了这篇 [程序员专用笔记CherryTree], 下载下来试用了一阵之后,感觉很不错,于是在公司的电脑上就从minipad2切换过来; 家里的Linux上也装上了它,开始把我一些零散的笔记挪进去。 CherryTree是个树状笔记软件,有着其它类似软件的功能 支持富文本(粗体/斜体/等宽/下划线/链接/背景色/前景色) 支持类似HTML...

weixin_30608503的博客 327

Minidwep-gtk安装手册

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34096182的博客 557

ubuntu下的c/c++环境搭建(转)

之前一直在windows下使用VS2013对C/C++程序进行设计,最近想在Linux下进行C/C++程序进行设计,首先第一步就是环境搭建。网上有很多大牛对此做过整理,就不再重新整理。尊重原作者的劳动成果,此处贴上转载地址 1. 首先是配置gcc,在ubuntu安装完成已经有gcc了(gcc是由GNU之父Stallman所开发的linux下的编译器,全称为GNU Compiler Collec...

多余的留白博客 365

ubuntu8.04 编程环境配置手记

部分内容转载自wiki,还有部分内容从baidu,google中整理得到在ubuntu8.04系统成功安装后,其实已经自带了很多工具。编辑工具:1、gedit2、vi-vim3、nano(pico)终端:1、xterm2、gnome-terminal开发环境:1、gcc1、安裝C/C++的Man手冊sudo apt-get install m

charming520的专栏 1330

基于.NET的开源GIS项目收集整理(转载)

基于.NET的开源GIS项目收集整理 NASA World Wind NASA World Wind是使用.NET开发的一个Windows窗体系统,以地球外观看得角度提供全球定位功能,类似于Google Earth。它结合了美国国家航空航天局(NASA)从卫星拍摄的图像,这些图像应用于Blue Marble, Landsat 7, SRTM, MODIS 以及其它更多的地方。链接:htt...

weixin_30700977的博客 81
上一篇: C++语言特性性能分析
下一篇: win7下安装PostgreSQL无服务器问题
nwpucoder
博客等级 码龄17年 49粉丝 9原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值