因为学了一点sqlite3数据库和gtk方面的东西,我又想到了做一个数据库简单操作的图形化显示,就是用gtk做一个页面,在页面上能够对指定数据库指定的表进行 增删查改操作。
我用的也就是滚动窗口+分栏列表和一些简单的按钮,行编辑操作。通过设计,我的想法是把查到的数据显示在分栏列表中,然后通过查看分栏列表中的数据,进行数据库操作。
这是实现后的界面,没有任何的修饰,主要是还没学到颜色等操作,有点小尴尬。
通过添加按钮可以向数据库的表中插入数据让然后在当前分栏列表中增加一行添加的数据
删除按钮不能通过点击分栏列表中的数据进行删除,本来是想实现这个功能的,当时总是有点问题,所以只能通过进行行编辑手动删除。
查找,修改也是这样的,不过修改的匹配条件只有账号,即id,修改后的id还是这个id,所以修改无法修改id的内容。
读取所有信息,就是遍历数据库该表中的所有数据。
虽然只是一个小小的项目,但还是花了一天的时间,老是遇到 段错误(核心已转储)问题,花费了不少时间,这个项目的主要问题还是如何把数据库中的数据显示到分栏列表中,简单的说就是我字符串赋值问题有点不会,最后还是查了怎么给字符数组分配内存才解决这个问题的。
不多数配上代码
#include <gtk/gtk.h>
#include "sqlite3.h"
#include <stdio.h>
GtkWidget *label;
GtkWidget *label1;
GtkWidget *label2;
GtkWidget *label3;
GtkWidget *label6;
GtkWidget *label4;
GtkWidget *fixed;
GtkWidget *clist;
const gchar *id;
const gchar *name;
const gchar *addr;
const gchar *sex;
gchar *text;
gint y;
gint x;
char *text1[]={"id","name","addr","sex"};
/*------------------------分栏列表点击事件---------------------------*/
void deal8(GtkWidget *clist,gint row,gint column,GdkEventButton
*event,gpointer user_data)
{
gtk_widget_queue_draw(clist);
gtk_clist_get_text(GTK_CLIST(clist),row,column,&text);
y=column;
x=row;
g_print("%s\n",text);
g_print("%d\n",x);
}
/*--------------------------得到行编辑的内容---------------------*/
void deal1(GtkButton *button,gpointer user_data)
{
id=gtk_entry_get_text((GtkEntry *)user_data);
}
void deal2(GtkButton *button,gpointer user_data)
{
name=gtk_entry_get_text((GtkEntry *)user_data);
}
void deal3(GtkButton *button,gpointer user_data)
{
addr=gtk_entry_get_text((GtkEntry *)user_data);
}
void deal4(GtkButton *button,gpointer user_data)
{
sex=gtk_entry_get_text((GtkEntry *)user_data);
}
/*-----------------------------------------数据库删除操作--------------------------------*/
void deal10(GtkButton *button,gpointer user_data)
{
sqlite3 *db;
int ret=sqlite3_open("wxb1.db",&db);
const gchar *text=gtk_button_get_label(GTK_BUTTON(button));
char cmd[100]="";
char *errmsg=NULL;
sprintf(cmd,"delete from person where id=\'%s\' or name=\'%s\' or addr=\'%s\' or sex=\'%s\';",id,name,addr,sex);
ret =sqlite3_exec(db,cmd,NULL,NULL,&errmsg);
if (ret != SQLITE_OK)
{
gtk_label_set_text(GTK_LABEL(label4),"删除失败");
}
else
gtk_label_set_text(GTK_LABEL(label4),"删除成功");
gtk_clist_remove(GTK_CLIST(clist),x);
ret=sqlite3_close(db);
}
/*-----------------------------------------数据库修改-----------------------------------*/
void deal9(GtkButton *button,gpointer user_data)
{
sqlite3 *db;
int ret=sqlite3_open("wxb1.db",&db);
const gchar *text=gtk_button_get_label(GTK_BUTTON(button));
char cmd[100]="";
char *errmsg=NULL;
//if(strcmp(id,")
sprintf(cmd,"update person set id=\'%s\',name=\'%s\',addr=\'%s\',sex=\'%s\' where id=\'%s\';",id,name,addr,sex,id);
ret =sqlite3_exec(db,cmd,NULL,NULL,&errmsg);
if (ret != SQLITE_OK)
{
gtk_label_set_text(GTK_LABEL(label4),"修改失败");
}
else
gtk_label_set_text(GTK_LABEL(label4),"修改成功");
ret=sqlite3_close(db);
int i;
int m=4;
char **p = (char *)malloc(m*sizeof(char *));
for(i=0;i<m;i++)
{
p[i]=(char *)malloc(sizeof(char *));
}
gtk_clist_remove(GTK_CLIST(clist),x);
strcpy(p[0],id);
strcpy(p[1],name);
strcpy(p[2],addr);
strcpy(p[3],sex);
gtk_clist_append(GTK_CLIST(clist),p);
for(i=0;i<m;i++)//释放空间
{free(p[i]);}
free(p);
}
/*----------------------------------------------数据库查找------------------------------------*/
void deal6(GtkButton *button,gpointer user_data)
{
sqlite3 *db;
//printf("%s\n",id);
//printf("%s\n",name);
int ret=sqlite3_open("wxb1.db",&db);
char *errmsg1=NULL;
char cmd3[100] = "";
sprintf(cmd3,"select id,name,addr,sex from person where id=\'%s\' or name=\'%s\' or addr=\'%s\' or sex=\'%s\';",id,name,addr,sex);
char ** table = NULL;
int r = 0,c = 0;
int i,j;
ret = sqlite3_get_table(db, cmd3,&table,&r,&c,&errmsg1);
if (ret != SQLITE_OK)
{
gtk_label_set_text(GTK_LABEL(label4),"查找失败");
}
else
gtk_label_set_text(GTK_LABEL(label4),"查找成功");
int m=4;
char **p = (char *)malloc(m*sizeof(char *));
for(i=0;i<m;i++)
{
p[i]=(char *)malloc(sizeof(char *));
}
gtk_clist_clear(GTK_CLIST(clist));
int k=0;
//const gchar *text=gtk_button_get_label(GTK_BUTTON(button));
//printf("%s\n",id);
if (r!=0)
{
for (i = 1; i < r+1; ++i)
{
for (j = 0; j < c; ++j)
{
strcpy(p[k],table[i*c+j]);
k++;
if(k==4){
gtk_clist_append(GTK_CLIST(clist),p);
k=0;}
}
//printf("\n");
}
}
for(i=0;i<m;i++)
{free(p[i]);}
free(p);
ret=sqlite3_close(db);
}
/*--------------------------------数据库读操作--------------------------*/
void deal7(GtkButton *button,gpointer user_data)
{
sqlite3 *db;
int ret=sqlite3_open("wxb1.db",&db);
char *errmsg1=NULL;
char cmd3[100] = "";
sprintf(cmd3,"select *from person;");
char ** table = NULL;
int r = 0,c = 0;
int i,j;
ret = sqlite3_get_table(db, cmd3,&table,&r,&c,&errmsg1);
if (ret != SQLITE_OK)
{
gtk_label_set_text(GTK_LABEL(label4),"读取失败");
}
else
gtk_label_set_text(GTK_LABEL(label4),"读取成功");
gtk_clist_clear(GTK_CLIST(clist));
int m=4;
char **p = (char *)malloc(m*sizeof(char *));
for(i=0;i<m;i++)
{
p[i]=(char *)malloc(sizeof(char *));
}
int k=0;
if (r!=0)
{
for (i = 1; i < r+1; ++i)
{
for (j = 0; j < c; ++j)
{
//printf("-%s-", table[i*c+j]);
strcpy(p[k],table[i*c+j]);
k++;
if(k==4){
gtk_clist_append(GTK_CLIST(clist),p);
k=0;}
}
//printf("\n");
}
}
for(i=0;i<m;i++){
free(p[i]);
}
free(p);
ret=sqlite3_close(db);
}
/*--------------------------------数据库写操作--------------------------*/
void deal5(GtkButton *button,gpointer user_data)
{
sqlite3 *db;
int ret=sqlite3_open("wxb1.db",&db);
const gchar *text=gtk_button_get_label(GTK_BUTTON(button));
char cmd[100]="";
char *errmsg=NULL;
sprintf(cmd,"insert into person values(\'%s\',\'%s\',\'%s\',\'%s\');",id,name,addr,sex);
ret =sqlite3_exec(db,cmd,NULL,NULL,&errmsg);
if (ret != SQLITE_OK)
{
gtk_label_set_text(GTK_LABEL(label4),"添加失败");
}
else
gtk_label_set_text(GTK_LABEL(label4),"添加成功");
int i;
int m=4;
char **p = (char *)malloc(m*sizeof(char *));
for(i=0;i<m;i++)
{
p[i]=(char *)malloc(sizeof(char *));
}
strcpy(p[0],id);
strcpy(p[1],name);
strcpy(p[2],addr);
strcpy(p[3],sex);
gtk_clist_append(GTK_CLIST(clist),p);
for(i=0;i<m;i++)
{
free(p[i]);}
free(p);
ret=sqlite3_close(db);
}
int main(int argc,char *argv[])
{
gtk_set_locale();
gtk_init(&argc,&argv);
gtk_init(&argc,&argv);
GtkWidget *window= gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title((GtkWindow*)window,"数据库");
//显示窗口标题
gtk_widget_set_size_request(window,600,480);
//显示窗口大小
gtk_window_set_position((GtkWindow*)window,GTK_WIN_POS_CENTER_ALWAYS);
//窗口位置设置:总是居中
g_signal_connect(window,"destroy",G_CALLBACK(gtk_main_quit),NULL);
//窗口销毁 即程序结束
fixed=gtk_fixed_new();
//添加容器
gtk_container_add(GTK_CONTAINER(window),fixed);
//把容器放入窗口
label=gtk_label_new("账号:");
//定义字符串
gtk_fixed_put(GTK_FIXED(fixed),label,10,10);
//把字符串放进容器中
label1=gtk_label_new("密码:");
//定义字符串
gtk_fixed_put(GTK_FIXED(fixed),label1,10,60);
//把字符串放进容器中
label2=gtk_label_new("地址:");
//定义字符串
gtk_fixed_put(GTK_FIXED(fixed),label2,10,110);
//把字符串放进容器中
label3=gtk_label_new("性别:");
//定义字符串
gtk_fixed_put(GTK_FIXED(fixed),label3,10,160);
//把字符串放进容器中
label4=gtk_label_new("");
//定义字符串
gtk_fixed_put(GTK_FIXED(fixed),label4,85,200);
//把字符串放进容器中
/*-------------------------------行编辑------------------------*/
GtkWidget *entry4=gtk_entry_new();
//设置行编辑控件
gtk_fixed_put(GTK_FIXED(fixed),entry4,40,0);
//放入固定容器
gtk_entry_set_text(GTK_ENTRY(entry4),"");
//设置控件初始文字为空
gtk_editable_set_editable((GtkEditable *)entry4,TRUE);
//设置控件可编辑
gtk_widget_set_size_request(entry4,156,30);
GtkWidget *entry1=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(fixed),entry1,40,50);
gtk_entry_set_text(GTK_ENTRY(entry1),"");
gtk_editable_set_editable((GtkEditable *)entry1,TRUE);
gtk_widget_set_size_request(entry1,156,30);
GtkWidget *entry2=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(fixed),entry2,40,100);
gtk_entry_set_text(GTK_ENTRY(entry2),"");
gtk_editable_set_editable((GtkEditable *)entry2,TRUE);
gtk_widget_set_size_request(entry2,156,30);
GtkWidget *entry3=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(fixed),entry3,40,150);
gtk_entry_set_text(GTK_ENTRY(entry3),"");
gtk_editable_set_editable((GtkEditable *)entry3,TRUE);
gtk_widget_set_size_request(entry3,156,30);
/*-----------------------------------按钮设置----------------------------*/
GtkWidget *button1=gtk_button_new_with_label("添加");
//设置按钮
gtk_fixed_put(GTK_FIXED(fixed),button1,60,240);
//把按钮放入容器中
gtk_widget_set_size_request(button1,50,50);
//设置按钮大小
GtkWidget *button2=gtk_button_new_with_label("修改");
//设置按钮
gtk_fixed_put(GTK_FIXED(fixed),button2,60,320);
//把按钮放入容器中
gtk_widget_set_size_request(button2,50,50);
//设置按钮大小
GtkWidget *button3=gtk_button_new_with_label("删除");
//设置按钮
gtk_fixed_put(GTK_FIXED(fixed),button3,140,240);
//把按钮放入容器中
gtk_widget_set_size_request(button3,50,50);
//设置按钮大小
GtkWidget *button4=gtk_button_new_with_label("查找");
//设置按钮
gtk_fixed_put(GTK_FIXED(fixed),button4,140,320);
//把按钮放入容器中
gtk_widget_set_size_request(button4,50,50);
//设置按钮大小
GtkWidget *button5=gtk_button_new_with_label("读取所有信息");
//设置按钮
gtk_fixed_put(GTK_FIXED(fixed),button5,80,400);
//把按钮放入容器中
gtk_widget_set_size_request(button5,100,30);
//设置按钮大小
/*------------------------滚动窗口---------------------------------------*/
GtkWidget *gundong=gtk_scrolled_window_new(NULL,NULL);
gtk_fixed_put(GTK_FIXED(fixed),gundong,200,0);
gtk_widget_set_size_request(gundong,400,480);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(gundong),
GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
/*--------------------------------分栏列表----------------------------*/
char *title[]={"账号","密码","地址","性别"};
char *text1[]={"Lucy","asa","北京","男"};
//gchar *str;
clist=gtk_clist_new_with_titles(4,title);//创建带标题的分栏列表
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(gundong),clist);
//gtk_clist_column_titles_hide(GTK_CLIST(clist));
gtk_clist_set_column_width(GTK_CLIST(clist),0,100);//设置列的宽度
gtk_clist_set_column_width(GTK_CLIST(clist),1,100);
gtk_clist_set_column_width(GTK_CLIST(clist),2,100);
gtk_clist_set_column_width(GTK_CLIST(clist),3,60);
//gtk_clist_set_row_height(GTK_CLIST(clist),100);
gtk_clist_set_column_justification(GTK_CLIST(clist),1,GTK_JUSTIFY_CENTER);
gtk_clist_set_column_justification(GTK_CLIST(clist),2,GTK_JUSTIFY_CENTER);
gtk_clist_set_column_justification(GTK_CLIST(clist),3,GTK_JUSTIFY_CENTER);
//gtk_clist_set_column_justification(GTK_CLIST(clist),1,GTK_JUSTIFY_CENTER);
gtk_clist_append(GTK_CLIST(clist),text1);
/*----------------------------------回调函数调用--------------------------------*/
g_signal_connect(button1,"clicked",G_CALLBACK(deal1),entry4);
g_signal_connect(button1,"clicked",G_CALLBACK(deal2),entry1);
g_signal_connect(button1,"clicked",G_CALLBACK(deal3),entry2);
g_signal_connect(button1,"clicked",G_CALLBACK(deal4),entry3);
g_signal_connect(button1,"clicked",G_CALLBACK(deal5),NULL);//添加操作
g_signal_connect(button2,"clicked",G_CALLBACK(deal1),entry4);
g_signal_connect(button2,"clicked",G_CALLBACK(deal2),entry1);
g_signal_connect(button2,"clicked",G_CALLBACK(deal3),entry2);
g_signal_connect(button2,"clicked",G_CALLBACK(deal4),entry3);
g_signal_connect(button2,"clicked",G_CALLBACK(deal9),NULL);//数据修改操作
g_signal_connect(button3,"clicked",G_CALLBACK(deal1),entry4);
g_signal_connect(button3,"clicked",G_CALLBACK(deal2),entry1);
g_signal_connect(button3,"clicked",G_CALLBACK(deal3),entry2);
g_signal_connect(button3,"clicked",G_CALLBACK(deal4),entry3);
g_signal_connect(button3,"clicked",G_CALLBACK(deal10),NULL);//删除操作
g_signal_connect(button4,"clicked",G_CALLBACK(deal1),entry4);
g_signal_connect(button4,"clicked",G_CALLBACK(deal2),entry1);
g_signal_connect(button4,"clicked",G_CALLBACK(deal3),entry2);
g_signal_connect(button4,"clicked",G_CALLBACK(deal4),entry3);
g_signal_connect(button4,"clicked",G_CALLBACK(deal6),NULL);//查找操作
g_signal_connect(button5,"clicked",G_CALLBACK(deal7),NULL);
g_signal_connect(clist,"select-row",G_CALLBACK(deal8),NULL);
gtk_widget_show_all(window);
gtk_main();
}
一些编译后的图片
删除和修改操作后只显示一行修改的结果,还要点击读取所有信息按钮刷新。