【Linux】特别篇--GTK界面设计

article/2025/9/11 17:21:49

【Linux】特别篇--GTK界面设计

  • 一、GTK界面常用函数
    • 1、控件大小设置
    • 2、创建窗口
    • 3、创建控件
      • (1)标签label
      • (2)按键button
      • (3)行辑器
  • 二、GTK常用布局方法
    • 1、布局的使用方法(以水平布局为例)
    • 2、表格布局
    • 3、固定布局
    • 4、使用案例
  • 三、GTK信号与回调
    • 1、信号注册函数(库函数提供)
    • 2、回调函数(自己编写)
    • 3、使用案例

GTK(GIMP Toolkit)是一个 图形用户编程的接口。它完全免费,现在很多Linux集成系统都已经将GTK1.2版本打包进去了。

头文件为 #include <gtk/gtk.h>

一、GTK界面常用函数

1、控件大小设置

gtk_widget_set_usize(控件,宽度,高度);
gtk_widget_set_size_request(控件,宽度,高度);

2、创建窗口

窗口是一个只能容纳一个控件的容器

#include <gtk/gtk.h>  //linux系统下包含int main()
{gtk_init(NULL,NULL);GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);//GTK_WINDOW_TOPLEVEL表示顶层显示gtk_widget_show(window);//gtk_widget_show()函数, 让GTK知道, 我们已经处理完设定其属性的工作, 并且可以显示它. gtk_main();   //界面监控打开return 0;
}

3、创建控件

(1)标签label

①创建一个lable

GtkWidget *label_one = gtk_label_new("label one");

②设置label的值

gtk_label_set_text(GTK_LABEL(label_one), "change the label_three text");

③获取label的值

const char *str = gtk_label_get_label(GTK_LABEL(label_one));

(2)按键button

①创建一个空按钮

GtkWidget *button = gtk_button_new();

②创建带文本的按钮

GtkWidget* button = gtk_button_new_with_label("Hello world");

③创建带图片的按钮

GtkWidget *image = gtk_image_new_from_file("./img/1.jpg");//当前目录下/img/1.jpg

④将按钮背景设为透明

gtk_button_set_relief(GTK_BUTTON(button2), GTK_RELIEF_NONE);

⑤修改按钮的文本

gtk_button_set_label(GTK_BUTTON(button1), "change");

⑥修改按钮的图片

gtk_button_set_image(GTK_BUTTON(button2), image);

⑦获取按钮的文本

const char *str = gtk_button_get_label(GTK_BUTTON(button1));

⑧获取按钮的图片

const char *str = gtk_button_get_label(GTK_BUTTON(button1));

(3)行辑器

①创建行辑器

GtkWidget *entry = gtk_entry_new();

②设置行辑器最大内容字符长度

gtk_entry_set_max_length(GTK_ENTRY(entry), 100);

③获取行辑器内容

entry_text = gtk_entry_get_text(GTK_ENTRY(entry));

④设置行辑器内容

gtk_entry_set_text(GTK_ENTRY(entry), "hello entry");

二、GTK常用布局方法

1、布局的使用方法(以水平布局为例)

①创建布局

GtkWidget* hbox = gtk_hbox_new(TRUE,10);//TRUE 决定是容器内控件大小否一致,10代表控件之间间隔以像素点为单位

②将布局添加到窗口当中

gtk_container_add(GTK_CONTAINER(window),hbox);

③将控件添加到布局当中

gtk_container_add(GTK_CONTAINER(hbox),button1);

④显示

gtk_widget_show_all(window);

2、表格布局

①创建布局

GtkWidget* table = gtk_table_new(5,4,TRUE);//创建一个表格布局,5行4列,TRUE表示内部控件大小相等

②将布局添加到窗口中

gtk_container_add(GTK_CONTAINER(window),table);

③将控件添加到布局中

gtk_table_attach_defaults(GTK_TABLE(table),button0,0,1,4,5);

在这里插入图片描述
④显示

gtk_widget_show_all(window);

3、固定布局

①创建布局

GtkWidget *fixed = gtk_fixed_new();

②将控件添加到布局中

gtk_fixed_put(GTK_FIXED(fixed),button,100,100);

4、使用案例

编译C文件
在这里插入图片描述

①水平布局

#include <gtk/gtk.h>int main(int argc, char const *argv[])
{gtk_init(NULL,NULL);//任何gtk程序都以这个开始GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);GtkWidget* button = gtk_button_new_with_label("hello");GtkWidget* button1 = gtk_button_new_with_label("hello1");GtkWidget* hbox = gtk_hbox_new(TRUE,10);gtk_widget_set_usize(window,200,200);gtk_container_add(GTK_CONTAINER(window),hbox);gtk_container_add(GTK_CONTAINER(hbox),button);gtk_container_add(GTK_CONTAINER(hbox),button1);gtk_widget_show_all(window);gtk_main();//gtk事件监听return 0;
}

效果
在这里插入图片描述


②布局嵌套

#include <gtk/gtk.h>int main(int argc, char const *argv[])
{gtk_init(NULL,NULL);//任何gtk程序都以这个开始GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);GtkWidget* button = gtk_button_new_with_label("hello");GtkWidget* button1 = gtk_button_new_with_label("hello1");GtkWidget* button3 = gtk_button_new_with_label("hello3");GtkWidget* button4 = gtk_button_new_with_label("hello4");GtkWidget* vbox = gtk_vbox_new(TRUE,10);GtkWidget* hbox1 = gtk_hbox_new(TRUE,10);gtk_widget_set_usize(window,200,200);gtk_container_add(GTK_CONTAINER(window),vbox);gtk_container_add(GTK_CONTAINER(vbox),hbox1);gtk_container_add(GTK_CONTAINER(hbox1),button3);gtk_container_add(GTK_CONTAINER(hbox1),button4);gtk_container_add(GTK_CONTAINER(vbox),button);gtk_container_add(GTK_CONTAINER(vbox),button1);gtk_widget_show_all(window);gtk_main();//gtk事件监听return 0;
}

效果
在这里插入图片描述


③表格布局

#include <gtk/gtk.h>int main(int argc, char const *argv[])
{gtk_init(NULL,NULL);GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);GtkWidget* table = gtk_table_new(5,4,TRUE);GtkWidget* button1 = gtk_button_new_with_label("button1");gtk_container_add(GTK_CONTAINER(window),table);gtk_table_attach_defaults(GTK_TABLE(table),button1,2,3,1,2);gtk_widget_show_all(window);gtk_main();return 0;
}

效果
在这里插入图片描述


④固定布局

#include <gtk/gtk.h>int main(int argc, char const *argv[])
{gtk_init(NULL,NULL);GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);GtkWidget* fixed = gtk_fixed_new();GtkWidget* button = gtk_button_new_with_label("hahaha");gtk_widget_set_usize(window,200,200);gtk_container_add(GTK_CONTAINER(window),fixed);gtk_fixed_put(GTK_FIXED(fixed),button,100,100);gtk_widget_show_all(window);gtk_main();return 0;
}

效果
在这里插入图片描述


三、GTK信号与回调

1、信号注册函数(库函数提供)

g_signal_connect(button0, "pressed", G_CALLBACK(deal_num), entry);
g_signal_connect(控件, "信号", G_CALLBACK(回调函数名), 传递的数据);

按键常用信号

  • “clicked” : 单击按钮时触发
  • “pressed” : 按下按钮时触发
  • “released” : 释放按钮时触发

行辑器常用信号:

  • “activate”:当用户在文本输入控件内部按回车键时引发activate信号;

2、回调函数(自己编写)

示例1:

void deal_pressed(GtkButton *button, gpointer user_data)
{const char *text = gtk_button_get_label(button);printf("%s----%s\n",(char *)user_data, text );return;
}

示例2:

void deal_num(GtkButton *button,gpointer data){const char* text = gtk_button_get_label(button);if(0==strcmp(text,"c")){buf[strlen(buf)-1] = 0;	}else{int a = 0,b = 0;char c;strcat(buf,text);if(0==strcmp("=",text)){printf("text==##%s##\n",text);sscanf(buf,"%d%c%d",&a,&c,&b);printf("-------001----%c---\n",c);if('+'==c){sprintf(buf,"%d",a+b);}else if('-'==c){sprintf(buf,"%d",a-b);}else if('*'==c){sprintf(buf,"%d",a*b);			}else if('/'==c){sprintf(buf,"%d",a/b);			}}}gtk_entry_set_text(GTK_ENTRY(data),buf);
}

3、使用案例

#include <stdio.h>
#include <gtk/gtk.h>const char* ch="";void deal_num(GtkButton* button,gpointer* udata){ch = gtk_button_get_label(GTK_BUTTON(button));gtk_entry_set_text(GTK_ENTRY(udata),ch);
}int main(int argc, char const *argv[])
{gtk_init(NULL,NULL);GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);GtkWidget* button1 = gtk_button_new_with_label("1");GtkWidget* button2 = gtk_button_new_with_label("2");GtkWidget* entry = gtk_entry_new();GtkWidget* table = gtk_table_new(5,4,TRUE);gtk_container_add(GTK_CONTAINER(window),table);gtk_table_attach_defaults(GTK_TABLE(table),entry,0,4,0,1);gtk_table_attach_defaults(GTK_TABLE(table),button1,0,1,1,2);g_signal_connect(button1,"pressed",G_CALLBACK(deal_num),entry);gtk_widget_show_all(window);gtk_main();return 0;
}

效果:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/mVPTsUqq.shtml

相关文章

GTK入门教程

GTK入门教程 1.GTK简介 GTK&#xff08;GIMP Toolkit)是一套源码以LGPL许可协议分发、跨平台的图形工具包。最初是为GIMP写的&#xff0c;已成为一个功能强大、设计灵活的一个通用图形库&#xff0c;是GNU/Linux下开发图形界面的应用程序的主流开发工具之一。当然&#xff0c;…

gtk学习总结:GTK从入门到放弃,三天包教包会

今天花了一些时间复习之前学习过的gtk&#xff0c;感觉东西光学不用忘得好快啊&#xff0c;在这做个之前学过的内容的备份&#xff0c;希望对大家有用&#xff0c;也希望大家不要从入门到放弃。文中有些代码例子可能来自《GTK从入门到精通》吧&#xff0c;我不记得了&#xff0…

gcc下载地址

网上看到有提供的http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/&#xff0c;可以打开&#xff0c;但是下载太慢了 这里记录一个下载很快的地址https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/&#xff0c;为清华大学的开源镜像网站 想要找其他的开源软件&#xff0c;…

如何安装GCC

现在的CentOs8上没有自带的gcc编译器因此需要下载&#xff08;注意&#xff1a;这里的下载是指在虚拟机中下载&#xff0c;不是指在电脑上下载&#xff09; 若运行gcc时出现appstream 下载元数据失败则表明没有安装gcc。 1 首先需要获得root权限**** 在终端模式下输入su&…

arm-Linux-gcc交叉编译器和gcc编译器的下载地址

1.arm-none-linux-gnueabi-gcc下载 http://www.veryarm.com/arm-none-linux-gnueabi-gcc arm-none-Linux-gnueabi-gcc是 Codesourcery 公司&#xff08;目前已经被Mentor收购&#xff09;基于GCC推出的的ARM交叉编译工具。可用于交叉编译ARM系统中所有环节的代码&#xff0c;包…

Windows中安装GCC教程

GCC的安装教程 GCC简介 GCC编译器通常在Linux系统下使用&#xff0c;一般来说大部分发行的系统会默认安装&#xff0c;GCC编译器使用gcc指令在终端进行shell操作。 对于新接触Linux的朋友来说&#xff0c;简单的在Windows中练习过渡一下应该就足够了。&#xff08;我就是因为…

windows下安装gcc编译器(c/c++/fortran)

首先下载MinGW - Minimalist GNU for Windows 下载结束后双击&#xff0c;点击下一步即可&#xff0c; 然后勾选要安装的组件&#xff1a; 点击应用&#xff1a; 开始安装&#xff08;这一步要经过漫长的下载过程&#xff0c;请耐心等待&#xff09;&#xff1a; 修改环境变量…

软件安装 gcc编译器

rpm命令及各参数使用。针对所有已安装的软件建立一个本地软件数据库&#xff0c;作为后续软件升级和卸载的依据本地软件数据库保存在目录/var/lib/rpm中 yum命令及各参数应用可以把本地计算机作为本地YUM源&#xff0c;也可以配置一个网络YUM源 YUM源&#xff1a;包含整理好的…

在线c++编译器(gcc)

这几年c标准委员会活跃起来&#xff0c;c11、14标准相续推出。对于想尝鲜又怕麻烦&#xff08;visual studio 更新慢&#xff0c;对标准的支持力度也不够。对于使用gcc的&#xff0c;替换系统的gcc版本或者安装个mingw也挺费事&#xff09;的人来说&#xff0c;可以优先考虑在线…

GCC编译器介绍

GCC是一套由GNU开发的编程语言编译器&#xff0c;在Linux系统下可以用它调用其他不同的工具进行预处理、编译、汇编、链接这样的工作&#xff0c;其执行效率比一般编译器高20%~30%。由于它是GNU项目之一&#xff0c;是开源的软件&#xff0c;我们可以直接从网上免费地下载安装它…

Window10-MinGW下载安装gcc,g++编译器

文章目录 完成流程步骤&#xff1a;出现的问题&#xff1a; 完成流程步骤&#xff1a; 1.MinGW下载 MinGW官网 mingw-get-setup.exe下载地址 2.MinGW安装 打开下载好的mingw-get-setup.exe &#xff0c;这里选择安装目录为F:\MinGW。 3.下载安装gcc/g ​ 通过MinGW Insta…

gcc官网以及各个版本下载地址

gcc的官网&#xff1a; http://gcc.gnu.org/ gcc镜像站点&#xff1a; https://gcc.gnu.org/mirrors.html 例如点 Japan的链接 到japan站点下载

GCC编译器 MinGW的下载安装使用教程

哎 总所周知 gcc可以用来编译C 和C。在linux广泛应用&#xff0c;那么window怎么使用gcc呢。 就要用到gcc的window工具----MInGW&#xff0c;安装好之后&#xff0c;直接可以在windows的dos界面编译。 下面讲解安装使用过程。 1.官网下载 MinGW - Minimalist GNU for Windows d…

APK反编译工具及方法

文章目录 一、下载工具apktooldex2jarjd-gui 二、APK反编译方法方法一&#xff1a;Apktool方法二&#xff1a;dex2jar jd-gui 三、APK文件的基本结构 一、下载工具 apktool apktool&#xff1a;资源文件获取&#xff0c;可以提取出图片文件和布局文件进行使用查看。 点击下载…

IDEA反编译Jar包

一.安装Java Bytecode Decomplier插件 (1) File–>Settings–>Plugins &#xff0c;搜索 Java Bytecode Decomplier 插件 (2) 查看安装插件的路径 File->Import Setting 注意&#xff1a;如果你的插件里面搜不到 Java Bytecode Decomplier&#xff0c;但是能搜到…

反编译jar包

问题描述&#xff1a; 前提说明&#xff1a;反编译别人的程序&#xff0c;是不推荐的&#xff0c;毕竟不太好&#xff0c;有可能涉及保密。 有时是没有办法而为之&#xff0c;原程序的开发工程师离职了&#xff0c;新的接口人业务不了解&#xff0c;但是也没有办法提供源码&…

反编译技术完全解析

1.前言 作为一个Android 程序猿,如果没有反编译过别人的apk&#xff0c;那有可能你是个假的程序猿~我们反编译别人apk可能是想看看别人优美的界面是怎么写的&#xff0c;或者是去获取别人的资源文件&#xff0c;又或者是看看某个功能是怎么实现的。记得在大学里&#xff0c;参…

idea反编译

1、问题描述 只有jar包&#xff0c;反编译下&#xff0c;看几个配置&#xff1b; 2、问题说明 用的idea里面的插件&#xff0c;java Decoplier&#xff0c;可以反编译jar包&#xff0c;效果挺好的&#xff0c;反编译出来的.java没乱码&#xff0c;可以直接看&#xff1b; 2…

超详细!apk安装包快速反编译,多种反编译及失败的解决方案(包含classes.dex的反编译,新增加快速反编译)

如要转载&#xff0c;请贴出原地址&#xff1a;https://blog.csdn.net/Nobody_else_/article/details/83996441 众所周知&#xff0c;我们开发所用的手机App安装包都是apk文件&#xff0c;Android应用开发完成之后&#xff0c;我们最终都会将应用打包成一个apk文件供用户安装&a…

反编译与反汇编

反编译做的就是编译的相反动作。举例来说&#xff0c;例如一个程序用C语言来写&#xff0c;写完之后要编译成CPU可以识别和运行的机器代码&#xff0c;也就是生成EXE程序。而反编译是反过来&#xff0c;把EXE反编译成编程源代码&#xff0c;也就是C程序&#xff0c;不过一般反编…