以下是allstruct.h:
struct mysqldata{//保存从数据库中取出的数据
int id;
int uid;
gchar *title;
gchar *context;
int ct;
};
int database_start();//连接远程数据库
void database_end();//关闭远程数据库,在下面那个退出函数中调用,
void on_quit();//退出函数,在此函数中关闭数据库
int on_add(struct mysqldata *data);//新建添加一条数据
int on_search(gchar *kwd);//查询信息
int on_update(gint id,struct mysqldata *data);//更新记录
int on_delete(gint id);//删除记录
jason_iii 于 2015-09-10 15:30:23发表:
不错不错
783456910 于 2015-08-16 06:18:17发表:
加油,菜鸟
zhaojj 于 2014-12-26 22:32:45发表:
加油
leolindaming 于 2014-12-26 20:56:40发表:
厉害,顶
chenhuanglin 于 2014-11-21 08:48:11发表:
好难哦
陈宇水 于 2014-10-24 08:19:14发表:
感觉好牛逼啊
783456910 于 2014-10-19 13:38:39发表:
顶,
783456910 于 2014-10-14 11:41:43发表:
顶,不要沉,还在继续制作
已解决treeview添加和清空问题.
待解决:新建记录,当前记录的修改及保存.以及英文chat模式.
783456910 于 2014-10-08 10:13:42发表:
上一张运行测试图:
输入.exit就退出了。
783456910 于 2014-10-08 09:54:56发表:
代码好乱,好粗糙。
做过这个的朋友指点一下呗,谢谢!
783456910 于 2014-10-08 09:48:31发表:
[i=s] 本帖最后由 783456910 于 2014-10-8 10:17 编辑 [/i]
//键值判断
{
{
(*首次明确编写目的:简单的记录数据,实现增删改查,实现模糊查询,实现全键盘操作*)
边学习边编太痛苦了,一个问题都要查询很长时间。
1、解决远程查询到ubuntu server 13下mysql数据库中文乱码问题
2、解决不能远程登录数据库问题。
3、解决本地结构体存储查询到的记录。
未解决问题:不强制转换类型编绎警告,记录插入、修改、模糊查询(用正则表达式),填充treeview,treeview选中事件。
#include
#include
#include
#include "allstruct.h"
GtkTextBuffer *buffer1;//显示文本框的buffer
GtkTextBuffer *buffer2;//输入文本框的buffer
gchar *textcmd,*msg;//命令字符串
GtkTextIter start,end;//当前行和起始行的位置
GtkTextIter iter;//为得到行号和列号
gint row,col;//得到行号和列号
GtkWidget *tree;//设置成全局,否则不能用
static MYSQL my_connection;
static gint dbconnected=0;
struct mysqldata mydata;//保存数据
gchar *columnname[5];
void tree_init(GtkTreeView *tree)
{//测试treeview的函数
enum{MYID_COLUMN,TITLE_COLUMN,AUTHOR_COLUMN,STATUS_COLUMN,NBR_COLUMN};
GtkTreeViewColumn *column;
GtkCellRenderer *renderer;
GtkTreeIter iter;
GtkTreeSelection *select;
GtkListStore *store;
store=gtk_list_store_new(NBR_COLUMN,G_TYPE_INT,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_FLOAT);
gtk_list_store_append(store,&iter);
gtk_list_store_set(store,&iter,
MYID_COLUMN,1,
TITLE_COLUMN,"美 kjsdfkdjsfkdjjf 丽大草原",
AUTHOR_COLUMN,"不知道",
STATUS_COLUMN,10.0,-1);
gtk_list_store_append(store,&iter);
gtk_list_store_set(store,&iter,
MYID_COLUMN,2,
TITLE_COLUMN,"美丽大草原",
AUTHOR_COLUMN,"不知道",
STATUS_COLUMN,10.0,-1);
gtk_tree_view_set_model(tree,GTK_TREE_MODEL(store));
renderer=gtk_cell_renderer_text_new();
g_object_set(G_OBJECT(renderer),"foreground","red",NULL);
column=gtk_tree_view_column_new_with_attributes("标题",renderer,"text",TITLE_COLUMN,NULL);
gtk_tree_view_append_column(tree,column);
}
void on_command(gchar *textcmd)
{
if(*textcmd=='.')
{
//cmd=g_strdup_printf("首字母=%c",*cmd);
//gtk_text_buffer_set_text(buffer1,cmd,-1);
// gtk_text_buffer_get_end_iter(buffer2,&end);
// gtk_text_buffer_insert(buffer2,&end,"\n这是一条命令",-1);
if(strcasecmp(textcmd,".exit")==0)
{
on_quit();
}
}else{
//gtk_text_buffer_set_text(buffer1,cmd,-1);//测试用的
on_search(textcmd);
}
}
void get_command(GtkTextBuffer *buffer,gpointer data)
{ //textview2回车事件函数,获得命令文件,也就是textview2中的文本
//关联iter
gtk_text_buffer_get_iter_at_mark(buffer2,&iter,gtk_text_buffer_get_insert(buffer2));
row=gtk_text_iter_get_line(&iter);//得到当前行号
// col=gtk_text_iter_get_line_offset(&iter);//得到当前列号
gtk_text_buffer_get_iter_at_line_offset(buffer2,&start,row,0);//当前行位置
gtk_text_buffer_get_iter_at_offset(buffer2,&end,-1);//到buffer最后的位置
//命令文本gchar*
textcmd=(gchar*)gtk_text_buffer_get_text(buffer2,&start,&end,FALSE);
on_command(textcmd);
//msg=g_strdup_printf("行=%d,列=%d",row,col);
//gtk_text_buffer_set_text(buffer1,msg,-1);
}
gboolean textview2_key_value(GtkWidget *widget,GdkEventKey *event,gpointer data)
{//textview2判断按键并处理函数
switch(event->keyval)
{
case GDK_KEY_Return:
//在此调用回车键函数
get_command(buffer2,NULL);
break;
default:
break;
}
return FALSE;
}
int main(int argc,char *argv[])
{//main主函数
GtkBuilder *builder;
GtkWidget *window;
GtkWidget *view2,*view1;
gtk_init(&argc,&argv);//初始化
builder=gtk_builder_new();//开始从glade文件创建或连接
gtk_builder_add_from_file(builder,"mem.glade",NULL);
gtk_builder_connect_signals(builder,NULL);
window=GTK_WIDGET(gtk_builder_get_object(builder,"window1"));//得到主窗体
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
tree=GTK_WIDGET(gtk_builder_get_object(builder,"treeview1"));
tree_init(GTK_TREE_VIEW(tree));
view1=GTK_WIDGET(gtk_builder_get_object(builder,"textview1"));
buffer1=gtk_text_view_get_buffer(GTK_TEXT_VIEW(view1));
view2=GTK_WIDGET(gtk_builder_get_object(builder,"textview2"));
buffer2=gtk_text_view_get_buffer(GTK_TEXT_VIEW(view2));
database_start();
g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(on_quit),NULL);//点窗口右上角的X销毁退出窗口和进程。
g_signal_connect(G_OBJECT(view2),"key-press-event",G_CALLBACK(textview2_key_value),NULL);
g_object_unref(G_OBJECT(builder));
gtk_widget_show(window);
gtk_main();
return 0;
}
int database_start()
{
if(dbconnected)
{
return 1;
}
gtk_text_buffer_get_end_iter(buffer2,&end);
mysql_init(&my_connection);
if(!mysql_real_connect(&my_connection,"远程数据库IP地址","用户名","密码","数据库名",0,NULL,0))
{
gtk_text_buffer_insert(buffer2,&end,"连接数据库失败!\n",-1);
msg=g_strdup_printf("\n%s",mysql_error(&my_connection));
gtk_text_buffer_insert(buffer2,&end,msg,-1);
return 0;
}
// gtk_text_buffer_insert(buffer2,&end,"数据库连接成功!\n",-1);
if(!mysql_set_character_set(&my_connection,"utf8"))
{
// gtk_text_buffer_insert(buffer2,&end,"设置utf8字符集成功\n",-1);
}
//mysql_query(&my_connection,"set names utf8");
// mysql_query(&my_connection,"set names 'utf8'");
dbconnected=1;
return 1;
}
void database_end()
{
if(dbconnected)
{
mysql_close(&my_connection);
dbconnected=0;
// gtk_text_buffer_insert(buffer2,&end,"\n数据库关闭成功!",-1);
}
}
void on_quit()
{
if(dbconnected)
{
database_end();
}
gtk_main_quit();
}
int on_search(gchar *data)
{
MYSQL_RES *res_ptr;
MYSQL_FIELD *field;
MYSQL_ROW *result_row;
int res;
int row,column;
int i,j;
gchar qs[200];
if(!dbconnected){return 0;}
sprintf(qs,"SELECT * FROM main");
//where title='how'");
mysql_query(&my_connection,"set names 'utf-8'");
// res=mysql_query(&my_connection,"insert into main values(0,0,'第一条','内容',0)");
res=mysql_query(&my_connection,qs);
if(res)
{
gtk_text_buffer_insert(buffer2,&end,"出错",-1);
}else{
res_ptr=mysql_store_result(&my_connection);
if(res_ptr){
if(mysql_num_rows(res_ptr)==0)
{
return 0;
}
column=mysql_num_fields(res_ptr);
row=mysql_num_rows(res_ptr)+1;
for(i=0;field=mysql_fetch_field(res_ptr);i++)
{
columnname[i]=g_strdup_printf("%s:\n",field->name);
}
gtk_text_buffer_get_end_iter(buffer1,&iter);
for(i=1;i
result_row=(MYSQL_ROW *)mysql_fetch_row(res_ptr);
mydata.id=(gint)result_row[0];
mydata.uid=(gint)result_row[1];
mydata.title=(gchar *)result_row[2];
mydata.context=(gchar *)result_row[3];
mydata.ct=(gint)result_row[4];
if(strcasecmp(mydata.title,data)==0)
{
for(j=2;j
msg=g_strdup_printf("%s",result_row[j]);
//gtk_text_buffer_insert(buffer1,&iter,columnname[i],-1);
// gtk_text_buffer_insert(buffer1,&iter,columnname[j],-1);
gtk_text_buffer_insert(buffer1,&iter,"id",-1);
gtk_text_buffer_insert(buffer1,&iter,msg,-1);
gtk_text_buffer_insert(buffer1,&iter,"\n",-1);
}
break;
}
}
}
mysql_free_result(res_ptr);
}
return 1;
}
783456910 于 2014-10-08 09:37:00发表:
以下是allstruct.h:
struct mysqldata{//保存从数据库中取出的数据
int id;
int uid;
gchar *title;
gchar *context;
int ct;
};
int database_start();//连接远程数据库
void database_end();//关闭远程数据库,在下面那个退出函数中调用,
void on_quit();//退出函数,在此函数中关闭数据库
int on_add(struct mysqldata *data);//新建添加一条数据
int on_search(gchar *kwd);//查询信息
int on_update(gint id,struct mysqldata *data);//更新记录
int on_delete(gint id);//删除记录
回首的曾经 于 2014-09-29 17:30:56发表:
无回帖,不论坛,这才是人道。
783456910 于 2014-09-29 16:07:12发表:
[i=s] 本帖最后由 783456910 于 2014-9-29 19:30 编辑 [/i]
//键值判断
经过使用ubuntu的摸索,于2014.09.11格掉xp安装debian,09月27日开始准备制作这个备忘录,因为刚接触gtk和glade(谢谢在网上发布资料的同学),有错误希望大家指正(本人纯业余自学,边学边做)。以下是实现日志:
2014.09.29 星期一
一、glade绘制界面,见附件。
1.只有三个可见部分:treeview1(左),textview1(右上),textview2(右下)。
2.在textview2中输入的文本作为命令,按回车执行。
打算在两个textview中使用类似vim的两种模式,一种是命令模式,一种是编辑模式。不过太难了,还在探索中。
3.textview1作为主要内容显示来使用。
4.treeview1作为查找到的所有标题(关键字)列表。
二、编程部分:
1、解决textview的buffer到gchar*的转换。
2、解决gtk textview按回车得到当前行文本的问题(整整查了两天的资料啊,晕)。
这个“当前行文本”是作为命令来用的。代码如下:
#include
#include
GtkTextBuffer *buffer1;//显示文本框textview1的buffer
GtkTextBuffer *buffer2;//输入文本框textview2的buffer
gchar *textcmd,*msg;//命令字符串,解析textcmd以执行各种命令
GtkTextIter start,end;//当前行开头到结尾的位置。(话说Iter是什么东西,搞得我都不会描述了)
GtkTextIter iter;//为得到行号和列号声明的
gint row,col;//得到行号和列号储存在这里
void mode_command(GtkTextBuffer *buffer,gpointer data)
{ //textview2回车事件函数
//下面一行是关联iter的,然后就可以用iter了。具体不太明白
gtk_text_buffer_get_iter_at_mark(buffer2,&iter,gtk_text_buffer_get_insert(buffer2));
row=gtk_text_iter_get_line(&iter);//得到当前行号,已用。
col=gtk_text_iter_get_line_offset(&iter);//得到当前列号,还没用到。
gtk_text_buffer_get_iter_at_line_offset(buffer2,&start,row,0);//当前行开始位置
gtk_text_buffer_get_iter_at_offset(buffer2,&end,-1);//到buffer结尾的位置(当前行结尾的位置)
//命令文本gchar*
textcmd=(char*)gtk_text_buffer_get_text(buffer2,&start,&end,FALSE);//取得当前行,存入textcmd
gtk_text_buffer_set_text(buffer1,textcmd,-1);//测试用的,以后删除。
//msg=g_strdup_printf("行=%d,列=%d",row,col);//gint转char*函数
//gtk_text_buffer_set_text(buffer1,msg,-1);
}
gboolean textview2_key_value(GtkWidget *widget,GdkEventKey *event,gpointer data)
{//textview2判断按键并处理函数
switch(event->keyval)
{
case GDK_KEY_Return:
//在此调用回车键函数
mode_command(buffer2,NULL);
break;
default:
break;
}
return FALSE;
}
int main(int argc,char *argv[])
{//main主函数
GtkBuilder *builder;
GtkWidget *window;
GtkWidget *view2,*view1;
gtk_init(&argc,&argv);//初始化
builder=gtk_builder_new();//开始从glade文件创建或连接
gtk_builder_add_from_file(builder,"mem.glade",NULL);
gtk_builder_connect_signals(builder,NULL);
window=GTK_WIDGET(gtk_builder_get_object(builder,"window1"));//得到主窗体
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
view1=GTK_WIDGET(gtk_builder_get_object(builder,"textview1"));
buffer1=gtk_text_view_get_buffer(GTK_TEXT_VIEW(view1));
view2=GTK_WIDGET(gtk_builder_get_object(builder,"textview2"));
buffer2=gtk_text_view_get_buffer(GTK_TEXT_VIEW(view2));
g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);//点窗口右上角的X销毁退出窗口和进程。
g_signal_connect(G_OBJECT(view2),"key-press-event",G_CALLBACK(textview2_key_value),NULL);
g_object_unref(G_OBJECT(builder));
gtk_widget_show(window);
gtk_main();
return 0;
}
大家看下代码,有问题留言。
looeta 于 2014-08-23 08:48:27发表:
还没这个水准