首页 > 其他分享 >GTK简单版计算器

GTK简单版计算器

时间:2022-09-28 18:10:13浏览次数:49  
标签:GTK entry button gtk new 简单 table 计算器


接下来我们做一个简单版的计算器。

1)获取按钮上的内容。

2)如果获取的内容是“ c ”,则代表进行退格操作,相当于删去最后一个字符。

3)如果获取的内容不是“ c ”,则把每一次获取的内容连接起来,如:

第一次按了 “ 1 ”, 第二次按了 “ + ”, 第三次按了 “ 1 ”, 连起来则变为 “1+1”。

4)如果获取的内容是“ = ”,则需要相应的运算。先把连起来的字符串拆出来,然后再进行相应操作,最后把运算结果重新显示到行编辑上。


完整代码如下:


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

char buf[50] = {0}; //全局变量,保存数据

// 按钮的回调函数
void deal_num(GtkButton *button, gpointer data)
{
const char *txt = gtk_button_get_label( button ); // 获取点击按钮的内容

// 退格操作
if( 0 == strcmp("c", txt) ){ // 如果是退格键
buf[strlen(buf) - 1] = 0; // 最后一个字符变为 0
//gtk_entry_set_text(GTK_ENTRY(data), buf); //重新给行编辑设定内容

}else{
int a = 0, b = 0;
char c;
strcat(buf, txt); // 内容追加

// 运算操作
if(0 == strcmp("=", txt) ){ // 如果是 " = "
sscanf(buf, "%d%c%d", &a, &c, &b); // 拆包
printf("a=%d, c = %c, d=%d\n", a, c, b);
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); // 给行编辑设定内容


}


int main( int argc, char *argv[] )
{
gtk_init (&argc, &argv); // 初始化

// 窗口的操作
GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); // 创建窗口
gtk_widget_set_size_request(window, 270, 320);

// 表格的操作
GtkWidget *table = gtk_table_new(5, 4, TRUE); // 表格布局,5行4列

// 行编辑的操作
GtkWidget *entry = gtk_entry_new(); // 行编辑的创建
//gtk_entry_set_text(GTK_ENTRY(entry), "2+2=4"); // 给行编辑设置内容
gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);// 设置行编辑不允许编辑,只做显示用

// 按钮的操作
GtkWidget *button0 = gtk_button_new_with_label("0"); // 按钮0
GtkWidget *button1 = gtk_button_new_with_label("1"); // 按钮1
GtkWidget *button2 = gtk_button_new_with_label("2"); // 按钮2
GtkWidget *button3 = gtk_button_new_with_label("3"); // 按钮3
GtkWidget *button4 = gtk_button_new_with_label("4"); // 按钮4
GtkWidget *button5 = gtk_button_new_with_label("5"); // 按钮5
GtkWidget *button6 = gtk_button_new_with_label("6"); // 按钮6
GtkWidget *button7 = gtk_button_new_with_label("7"); // 按钮7
GtkWidget *button8 = gtk_button_new_with_label("8"); // 按钮8
GtkWidget *button9 = gtk_button_new_with_label("9"); // 按钮9
GtkWidget *button_add = gtk_button_new_with_label("+"); // 加
GtkWidget *button_minus = gtk_button_new_with_label("-"); // 减
GtkWidget *button_multiply = gtk_button_new_with_label("*"); // 乘
GtkWidget *button_divide = gtk_button_new_with_label("/"); // 除
GtkWidget *button_equal = gtk_button_new_with_label("="); // 等于
GtkWidget *button_detele = gtk_button_new_with_label("c"); // 退格

// 布局操作
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), button0, 0, 1, 4, 5); // 按钮放入表格
gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);
gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);
gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);
gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);
gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);
gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);
gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);
gtk_table_attach_defaults(GTK_TABLE(table), button_multiply, 3, 4, 2, 3);
gtk_table_attach_defaults(GTK_TABLE(table), button_divide, 3, 4, 3, 4);
gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);
gtk_table_attach_defaults(GTK_TABLE(table), button_detele, 3, 4, 1, 2);

// 注册信号函数,把 entry 传给回调函数 deal_num()
g_signal_connect(button0, "pressed", G_CALLBACK(deal_num), entry);
g_signal_connect(button1, "pressed", G_CALLBACK(deal_num), entry);
g_signal_connect(button2, "pressed", G_CALLBACK(deal_num), entry);
g_signal_connect(button3, "pressed", G_CALLBACK(deal_num), entry);
g_signal_connect(button4, "pressed", G_CALLBACK(deal_num), entry);
g_signal_connect(button5, "pressed", G_CALLBACK(deal_num), entry);
g_signal_connect(button6, "pressed", G_CALLBACK(deal_num), entry);
g_signal_connect(button7, "pressed", G_CALLBACK(deal_num), entry);
g_signal_connect(button8, "pressed", G_CALLBACK(deal_num), entry);
g_signal_connect(button9, "pressed", G_CALLBACK(deal_num), entry);
g_signal_connect(button_add, "pressed", G_CALLBACK(deal_num), entry);
g_signal_connect(button_minus, "pressed", G_CALLBACK(deal_num), entry);
g_signal_connect(button_multiply, "pressed", G_CALLBACK(deal_num), entry);
g_signal_connect(button_divide, "pressed", G_CALLBACK(deal_num), entry);
g_signal_connect(button_equal, "pressed", G_CALLBACK(deal_num), entry);
g_signal_connect(button_detele, "pressed", G_CALLBACK(deal_num), entry);

gtk_widget_show_all(window); // 显示所有控件

gtk_main(); //进入事件循环

return 0;
}



操作图如下:


GTK简单版计算器_一步一步学习GTK+




GTK简单版计算器_sed_02




GTK简单版计算器_GTK入门学习_03




GTK简单版计算器_GTK入门学习_04




标签:GTK,entry,button,gtk,new,简单,table,计算器
From: https://blog.51cto.com/u_3002289/5720674

相关文章

  • GTK入门学习:布局练习之计算器
    接下来,我们做一个布局练习,如下图:我们用表格布局实现,表格布局参考坐标如下:这里我们用到行编辑控件(GtkEntry )。行编辑的创建:GtkWidget*gtk_entry_new(void);返回值:行编......
  • 为什么要学习GTK?
    开发图形界面的工具包有很多,windows有WPF、WinForm,Android有自带的SDK,IOS也有自己的一套,跨平台的话可以用Qt,结果发现,GTK真没它的用武之地。实际上,GTK的地位真是这样的,那我......
  • GTK入门学习:glade的介绍
    上面的学习中,我们是通过纯C语言代码来进行GTK编程的,这也是我们学习GTK的最佳方法,因为这样我们可以清楚地知道整个流程,大体流程如下:1)创建主窗口,根据需要设置窗口的相应属性2)......
  • GTK进阶学习:GTK实现截图功能( 可以指定截图范围 )
    按按钮截图,图片保存在当前路径为“save.png”:#include<gtk/gtk.h>#include<cairo.h>/********************************************************功能:指定窗口区域截图,需......
  • GTK常用控件之图片控件( GtkImage )
    图片控件和标签的作用很类似,都是作为显示用的,只是图片控件显示的内容是图片。图片控件的创建:GtkWidget*gtk_image_new_from_file(constgchar*filename);filename:图片的......
  • 基于Python的socket套接字的简单使用
    socket:进行应用程序之间的网络信息交互的工具几乎市面上所有具有网络通讯功能的软件,底层都使用了socket两个进程,分别开启sokcet服务,使用scoket可以在进程间进行通讯......
  • tmux的简单使用
    命名:tmux#直接进入tmuxnew-s<session-name>#新建指定会话tmuxls#查看已经开始的会话tmuxattach-t<session-name>#进入指......
  • 2022国庆节手抄报模板简单又漂亮,可用手机打印出来
    2022年国庆节马上就要到了,相信有不少小学生的父母都在做同一件事情,这就是辅导孩子完成一张国庆节手抄报。有的父母或孩子是比较有画画天赋的,能够轻松完成一份庆祝国庆节的......
  • 简单MD5加密工具-UTF-8
    importjava.io.UnsupportedEncodingException;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;importjava.time.LocalDateTime......
  • 【C++】关于智能指针的简单学习
    智能指针示例类:classString{private: stringm_value;public: String(stringstr):m_value(str){ cout<<"构造"<<m_value<<"\n"; } friendostream&o......