linux下基于GTK窗口编程

2012-05-08 17:19

 

写了几个小时的代码,被指针都指晕了...


#include <gtk/gtk.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "mysql/mysql.h"

#define hboxNumber  3

GtkWidget *window;//主窗体

GtkWidget *num_entry;//学号文本框
GtkWidget *name_entry;//姓名文本框
GtkWidget *class_entry;//班级文本框

GtkWidget *button_add;//新增按钮
GtkWidget *button_del;//删除按钮
GtkWidget *button_showAll;//显示所有学生按钮

GtkWidget *lbl_num;//学号标签
GtkWidget *lbl_name;//姓名标签
GtkWidget *lbl_class;//班级标签

GtkWidget *hbox[hboxNumber], *vbox;//水平和垂直盒子

GtkWidget *dialog;//对话框
GtkWidget *text;//文本区
GtkTextBuffer *buffer;//文本缓冲区

char sql[100];//sql语句字符串


void destroy(GtkWidget *widget,gpointer *data); //回调函数destroy,关闭窗口时系统自动调用

void btnAdd_clicked(GtkWidget *widget,gpointer *data);//新增按钮事件
void btnDel_clicked(GtkWidget *widget,gpointer *data);//删除按钮事件
void btnDisplay_clicked(GtkWidget *widget,gpointer *data);//显示所有学生按钮事件
void show_dialog(int index,gchar *msg);//对话框
int ISEmptyOrNull(const char *c);//判空函数
void create_text( void );//创建文本区
void insert_text (gchar *msg);//向文本区插入文字

int main(int argc,char **argv)
{
   int i, j;
   gtk_init(&argc,&argv);   //初始化图形显示环境
   window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  //创建窗口
   gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
         //设置当关闭窗口时,要执行的回调函数
   g_signal_connect(GTK_OBJECT(window),"destroy",GTK_SIGNAL_FUNC(destroy),NULL);

     //创建文本输入框
    num_entry = gtk_entry_new();
    name_entry = gtk_entry_new();
    class_entry = gtk_entry_new();
    gtk_widget_set_usize(window,600,300);  /*设置大小*/ 
    gtk_widget_set_usize(num_entry,50,25); 
    gtk_widget_set_usize(name_entry,100,25); 
    gtk_widget_set_usize(class_entry,100,25);   
   
    lbl_num=gtk_label_new("学号");/*创建label标签*/
    lbl_name=gtk_label_new("姓名");
    lbl_class=gtk_label_new("班级");

    button_add=gtk_button_new_with_label("添加学生");   /*创建按钮*/
    button_del=gtk_button_new_with_label("删除学生");
    button_showAll=gtk_button_new_with_label("显示所有学生信息");

    create_text ();//创建文本区


                    /*指定按钮监听事件*/
  g_signal_connect(GTK_OBJECT(button_add),"clicked", GTK_SIGNAL_FUNC(btnAdd_clicked), NULL);
     g_signal_connect(GTK_OBJECT(button_del),"clicked", GTK_SIGNAL_FUNC(btnDel_clicked), NULL);
  g_signal_connect(GTK_OBJECT(button_showAll),"clicked", GTK_SIGNAL_FUNC(btnDisplay_clicked), NULL);

    /*创建多个水平盒子*/
    for (i = 0; i < hboxNumber; i++)
{
      hbox[i] = gtk_hbox_new (TRUE, 2);
}
    vbox  = gtk_vbox_new (FALSE, 10);/*创建一个垂直盒子*/

    /*文本框和标签在第一个水平盒子中*/
gtk_box_pack_start (GTK_BOX(hbox[0]), lbl_num, TRUE, FALSE, 2);
    gtk_box_pack_start (GTK_BOX(hbox[0]), num_entry, TRUE, FALSE, 2);

gtk_box_pack_start (GTK_BOX(hbox[0]), lbl_name, TRUE, FALSE, 2); 
gtk_box_pack_start (GTK_BOX(hbox[0]), name_entry, TRUE, FALSE, 2); 

gtk_box_pack_start (GTK_BOX(hbox[0]), lbl_class, TRUE, FALSE, 2); 
gtk_box_pack_start (GTK_BOX(hbox[0]), class_entry, TRUE, FALSE, 2); 

    /*按钮在第二个水平盒子中*/
    gtk_box_pack_start (GTK_BOX(hbox[1]), button_add, TRUE, FALSE, 2);
    gtk_box_pack_start (GTK_BOX(hbox[1]), button_del, TRUE, FALSE, 2); 
gtk_box_pack_start (GTK_BOX(hbox[1]), button_showAll, TRUE, FALSE, 2); 

   /*列表框在第三个水平盒子中*/
    gtk_box_pack_start (GTK_BOX(hbox[2]), text, TRUE, FALSE, 2); 

    /*将水平盒子放入垂直盒子*/
    for (i=0; i < hboxNumber; i++)
      gtk_box_pack_start (GTK_BOX(vbox), hbox[i], FALSE, FALSE, 2);

    /*将垂直盒子加入到窗口中*/
    gtk_container_add(GTK_CONTAINER(window), vbox);

    /*显示按钮和窗口*/
    gtk_widget_show_all(window);

    /*进入消息处理循环*/
    gtk_main();
            
   return 0;
}

/*定义回调函数destroy,关闭窗口时系统自动调用*/
void destroy(GtkWidget *widget,gpointer *data) 
{
  gtk_main_quit();
}

/*
  执行SQL更新命令。
  参数:sql是SQL命令字符串。
  返回:0表示执行成功,非0表示错误。
*/
int execute_update_sql(char *sql)
{
  MYSQL mysql;
  int result=0;
  mysql_init(&mysql);  /*连接数据库*/
  mysql_real_connect(&mysql,"localhost","root","","student",0,NULL,0);
  mysql_real_query(&mysql,sql,strlen(sql));  /*执行sql命令*/
  result=mysql_errno(&mysql);  //得到执行结果代码,0表示正确,非0表示错误
  mysql_close(&mysql);  /*关闭数据库连接*/
  return result;
}



/*定义回调函数btnAdd_clicked,单击新增按钮时自动调用*/
void btnAdd_clicked(GtkWidget *widget,gpointer *data)
{
  const char *num;
  const char *name;
  const  char *class;
       num =gtk_entry_get_text (GTK_ENTRY (num_entry));//获取学号文本框的文本
       name=gtk_entry_get_text (GTK_ENTRY (name_entry));//获取姓名
       class=gtk_entry_get_text (GTK_ENTRY (class_entry));//获取班级

  if(ISEmptyOrNull(num))//判断是否为空值或者是空串
  {
     show_dialog(1,"请输入学号!!!");//显示对话框
     return;
  }
  if(ISEmptyOrNull(name))
  {
     show_dialog(1,"请输入姓名!!!");
   return;
  }
  if(ISEmptyOrNull(class))
  {
     show_dialog(1,"请输入班级!!!");
   return;
  }

  /*形成sql命令字符串*/
  sprintf(sql,"insert into stu_table(stu_no,stu_name,class) values('%s','%s','%s')",num,name,class);
  
  if(execute_update_sql(sql))/*执行sql命令字符串*/
  {
     show_dialog(2,"添加失败!!");
  }
  else
  { 
   show_dialog(1,"添加成功!!");
  }
  
}

/*定义删除按钮回调函数btnDel_clicked,单击新增按钮时自动调用*/
void btnDel_clicked(GtkWidget *widget,gpointer *data)
{
const char *num;
num =gtk_entry_get_text (GTK_ENTRY (num_entry));//获取学号文本框文本
if(ISEmptyOrNull(num))
{
     show_dialog(1,"请输入学号!!!");
}
else
  {
  /*形成sql命令字符串*/
   sprintf(sql,"delete from stu_table where stu_no='%s'",num);
   /*执行sql命令字符串*/
   if(execute_update_sql(sql))
   {
      show_dialog(2,"删除失败!");
   }
    else
    { 
     show_dialog(1,"删除成功!");
    }
  } 
}


/*定义显示列表按钮回调函数btnDisplay_clicked,单击新增按钮时自动调用*/
void btnDisplay_clicked(GtkWidget *widget,gpointer *data)
{
  int i,row_number, field_number;
  MYSQL mysql;
  MYSQL_RES *res;
  MYSQL_FIELD *fd;
  MYSQL_ROW row;
  char *ls_stu;
  char *str1;


  mysql_init(&mysql);/*连接数据库*/
  mysql_real_connect(&mysql,"localhost","root","","student",0,NULL,0);

  sprintf(sql,"select * from stu_table order by stu_no"); /*形成select命令字符串*/

  mysql_real_query(&mysql,sql,strlen(sql)); /*执行sql命令*/

  res=mysql_store_result(&mysql);//得到结果集
  row_number=(int)mysql_num_rows(res);//结果集行数
  field_number=(int)mysql_num_fields(res);//结果集总字段数

  gtk_text_buffer_set_text(GTK_TEXT_BUFFER(text),"",-1);//将文本区文本清空

  /*按列遍历结果集,显示记录*/
  while(fd=mysql_fetch_field(res))
  {
    sprintf(str1,"%-12s",fd->name);
    insert_text (str1);//将当前字段插入文本区末尾
  }

  insert_text ("\n"); //换行

/*按行遍历结果集,逐行显示记录*/
  while((row=mysql_fetch_row(res))!=NULL)
  {
    for(i=0;i<field_number;i++)
    {
   sprintf(str1,"%-12s",row[i]);;
   insert_text (str1);//将当前对应值插入文本区末尾
    }
    insert_text ("\n");
  }
  mysql_close(&mysql);  /*关闭数据库连接*/
}


/*定义对话框函数
   参数:第一个为对话框类型(1:消息类型,2:错误,3:询问,其他:警告)
     第二个参数为显示的字符串消息。*/
void show_dialog(int index,gchar *msg)
{
GtkMessageType type;//对话框类型
switch(index)
{
case 1: type=GTK_MESSAGE_INFO;break;
case 2:type=GTK_MESSAGE_ERROR;break;
case 3: type=GTK_MESSAGE_QUESTION;break;
default :type=GTK_MESSAGE_WARNING;
}
dialog = gtk_message_dialog_new(NULL, 
GTK_DIALOG_DESTROY_WITH_PARENT,type,GTK_BUTTONS_OK,msg);
    //gtk_message_dialog_new(指定父窗体,关闭时刻选择(此处为跟随父窗体),窗体图标类型,确认按钮,消息)
gtk_dialog_run(GTK_DIALOG(dialog));//显示对话框
gtk_widget_destroy(dialog);//单击OK关闭对话框

}


int ISEmptyOrNull(const char *c)
{
int IsEmpty = 0;
int length = strlen(c);
int n;
//遍历整个字符串,如也为空果全为空格,则返回字符串
for(n=0;n<length;n++)
{
    //判断ASCII码是否为32
    if(c[n]==32)
     IsEmpty=1;
    else
    {
     IsEmpty=0;
     //存在一个字符则跳出循环
     break;
    }
}
if(length == 0)
   return 1;
else if(IsEmpty)
   return 1;
else return 0;
}



void insert_text (gchar * data)
{
    GtkTextIter start,end;
//获取文本区的开始和结尾指针
gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(buffer),&start,&end);
    gtk_text_buffer_insert(GTK_TEXT_BUFFER(buffer),&end,data,strlen(data));//在末尾插入文本区
}


void create_text( void )
{
text = gtk_text_view_new ();//创建文本区
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));//获取文本缓冲区
gtk_widget_set_usize(text,500,190);//设置文本区大小
}


 

界面有点不好看...


上面这些是C源码

记得还要有数据库啊!!下面是数据库脚本:

drop database if exists student;
create database student;
use student;
CREATE TABLE stu_table(stu_no char(10), stu_name char (10), class char(10));
INSERT INTO stu_table VALUES('001', 'Tom', '1');
INSERT INTO stu_table VALUES('002', 'Peter', '3');
INSERT INTO stu_table VALUES('003', 'Mike', '2');


 

编译命令就很长了...有点儿坑爹的感觉....
gcc -o s4 s4.c `pkg-config --libs --cflags gtk+-2.0` -I/usr/include/mysql -L/usr/lib/mysql -lmysqlclient

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值