GTK3+Mysql C语言版图形数据库管理系统(二)

登录页面优化+数据库展示页面制作

windows+visualstudio2019配置GTK3教程

运行效果:

  1. 登录页面:
    登录页面
  2. 数据库展示页面:
    数据库展示页面

下一步:完善数据库展示页面的功能

#include <gtk/gtk.h>
#include <stdio.h>
#include <string.h>
#include <mysql.h>   //所需头文件
#include<stdlib.h>

#pragma comment (lib, "libmysql.lib")
MYSQL* conn_prt;     //创造一个MYSQL句柄
MYSQL_RES* res;
MYSQL_ROW row;

/*一些操作的命令起始部分*/
char select_head[50] = "select * from ";
char desc_head[50] = "desc ";
char insert_head[200] = "insert into ";
char drop_msg_head[50] = "delete from ";
char change_base_head[50] = "use ";

/*初始化mysql句柄*/
void self_init()
{
	conn_prt = mysql_init(NULL);
}

char* _(char* c)
{
    return(g_locale_to_utf8(c, -1, 0, 0, 0));
}

char* _2(const char* c)
{
    return(g_locale_to_utf8(c, -1, 0, 0, 0));
}
//typedef enum {
//    GTK_TREE_VIEW_GRID_LINES_NONE,
//    GTK_TREE_VIEW_GRID_LINES_HORIZONTAL,
//    GTK_TREE_VIEW_GRID_LINES_VERTICAL,
//    GTK_TREE_VIEW_GRID_LINES_BOTH
//} GtkTreeViewGridLines;

// 全局变量
GtkWidget* window_login;
GtkWidget* entry_login_username;
GtkWidget* entry_login_password;
GtkWidget* window_database;
gchar* dbvalue; // 当前选中的数据库名称
void login_submit(GtkButton* button, gpointer user_data); // 登录按钮的回调事件
void login_reset(GtkButton* button, gpointer user_data); // 重置按钮的回调事件
void create_db_window(); // 创建数据库展示页面
void init_dblist(GtkWidget* list); // 数据库展示列表初始化
void add_to_dblist(GtkWidget* list, const gchar* str); // 数据库展示列表添加函数
void on_dbchanged(GtkWidget* widget, gpointer label); // 数据库展示列表点击回调函数
int main(int argc, char* argv[]) {

    gtk_init(&argc, &argv);
    self_init();
    // ------------登录页面
    window_login = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    /*gtk_widget_set_size_request(window_login, 800, 500);*/
    gtk_window_set_title(GTK_WINDOW(window_login), _2("登录"));

    GtkWidget* table_login = gtk_table_new(3, 3, true); // 表格容器
    gtk_container_add(GTK_CONTAINER(window_login), table_login); // 将表格容器加到窗口中
    GtkWidget* label_login_username = gtk_label_new(_2("用户名")); // 用户名标签
    gtk_table_attach_defaults(GTK_TABLE(table_login), label_login_username, 0, 1, 0, 1); // 将用户名标签加到表格中
    entry_login_username = gtk_entry_new(); // 用户名输入框
    gtk_table_attach_defaults(GTK_TABLE(table_login), entry_login_username, 1, 3, 0, 1); // 将用户名输入框加到表格中
    GtkWidget* label_login_password = gtk_label_new(_2("密码")); // 密码标签
    gtk_table_attach_defaults(GTK_TABLE(table_login), label_login_password, 0, 1, 1, 2); // 将密码标签加到表格中
    entry_login_password = gtk_entry_new(); // 密码输入框
    gtk_table_attach_defaults(GTK_TABLE(table_login), entry_login_password, 1, 3, 1, 2); // 将密码输入框加到表格中
    gtk_entry_set_visibility(GTK_ENTRY(entry_login_password), false); // 设置密码输入框输入内容不可见
    GtkWidget* button_login = gtk_button_new_with_label(_2("登录")); // 登录按钮
    gtk_table_attach_defaults(GTK_TABLE(table_login), button_login, 0, 1, 2, 3); // 将登录按钮添加到表格中
    g_signal_connect(button_login, "pressed", G_CALLBACK(login_submit), NULL); // 设置登录按钮点击事件
    GtkWidget* button_reset = gtk_button_new_with_label(_2("重置")); // 重置按钮
    gtk_table_attach_defaults(GTK_TABLE(table_login), button_reset, 2, 3, 2, 3); // 将重置按钮添加到表格中
    g_signal_connect(button_reset, "pressed", G_CALLBACK(login_reset), NULL); // 设置重置按钮点击事件
    g_signal_connect(window_login, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    gtk_window_set_position(GTK_WINDOW(window_login), GTK_WIN_POS_CENTER_ALWAYS);
    gtk_container_set_border_width(GTK_CONTAINER(window_login), 10);
    gtk_widget_show(window_login);
    gtk_widget_show_all(window_login);
    gtk_main();

    return 0;
}
void login_submit(GtkButton* button, gpointer user_data)
{
    const char* username = gtk_entry_get_text(GTK_ENTRY(entry_login_username));
    const char* password = gtk_entry_get_text(GTK_ENTRY(entry_login_password));
    // printf("%s", username);
    if (!mysql_real_connect(conn_prt, "localhost", username, password, "mysql", 3306, NULL, 0))
    {
        printf("failed to connect:%s\n", mysql_error(conn_prt));
    }
    else {
        mysql_set_character_set(conn_prt, "gbk"); // 设置编码格式为gbk
        printf("connect success!\n");
        gtk_widget_hide(window_login);
        create_db_window();
    }

}

void login_reset(GtkButton* button, gpointer user_data)
{
    gtk_entry_set_text(GTK_ENTRY(entry_login_username), "");
    gtk_entry_set_text(GTK_ENTRY(entry_login_password), "");
}

void create_db_window()
{ // 展示数据库页面
    GtkWidget* db_list;
    GtkWidget* db_box;
    GtkWidget* db_label;
    GtkTreeSelection* selection;
    window_database = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window_database), _2("数据库展示页面"));
    g_signal_connect(window_database, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    gtk_window_set_position(GTK_WINDOW(window_database), GTK_WIN_POS_CENTER_ALWAYS);
    gtk_container_set_border_width(GTK_CONTAINER(window_login), 10);
    
    db_list = gtk_tree_view_new();
    // 设置标题的可见状态
    gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(db_list), true);
    db_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
    gtk_box_pack_start(GTK_BOX(db_box), db_list, true, true, 5); // 将列表装入box容器中
    db_label = gtk_label_new("");
    gtk_box_pack_start(GTK_BOX(db_box), db_label, false, false, 5); // 将文本标签装入box容器
    gtk_tree_view_set_grid_lines(GTK_TREE_VIEW(db_list), GTK_TREE_VIEW_GRID_LINES_BOTH);
    init_dblist(db_list);
    //add_to_dblist(db_list, _2("河南大学"));
    //add_to_dblist(db_list, _2("龙亭区"));
    //add_to_dblist(db_list, _2("开封市"));

    selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(db_list));
    g_signal_connect(selection, "changed",
        G_CALLBACK(on_dbchanged), db_label);


    gtk_widget_set_size_request(window_database, 400, 100);
    gtk_container_add(GTK_CONTAINER(window_database), db_box);
    gtk_widget_show(window_database);
    gtk_widget_show_all(window_database);
}
enum
{
    DBLIST_ITEM=0,
    DB_COLUMNS
};
void init_dblist(GtkWidget* list)
{
    // 要想视图显示出数据,必须建立GtkCellRender与GtkTreeViewColumn
    GtkCellRenderer* renderer;
    GtkTreeViewColumn* column;
    GtkListStore* store;

    // 建立一个GtkCellRenderer
    renderer = gtk_cell_renderer_text_new();
    //建立一个带标题的列 并且将renderer放入其中使其能显示内容
    column = gtk_tree_view_column_new_with_attributes("Database", renderer, "text", DBLIST_ITEM, NULL);
    //将列加入gtk_tree_view
    gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);
    store = gtk_list_store_new(DB_COLUMNS, G_TYPE_STRING);
    //关联视图与模型
    gtk_tree_view_set_model(GTK_TREE_VIEW(list), GTK_TREE_MODEL(store));
    //将数据模型交给视图管理,视图销毁时数据会被一同销毁
    g_object_unref(store);

    int t;
    char query[50] = "show databases";
    t = mysql_real_query(conn_prt, query, strlen(query));
    if (t)
    {
        printf("failed to query:%s\n", mysql_error(conn_prt));
        return;
    }

    res = mysql_store_result(conn_prt);
    while (row = mysql_fetch_row(res))
    {
        for (t = 0; t < mysql_num_fields(res); t++)
        {
            printf("%s\t", row[t]);
            add_to_dblist(list, _2(row[t]));
        }
    }
}
void add_to_dblist(GtkWidget* list, const gchar* str)
{
    GtkListStore* store;
    GtkTreeIter iter;
    store = GTK_LIST_STORE(gtk_tree_view_get_model
    (GTK_TREE_VIEW(list)));
    gtk_list_store_append(store, &iter);
    gtk_list_store_set(store, &iter, DBLIST_ITEM, str, -1);
}
void on_dbchanged(GtkWidget* widget, gpointer label)
{
    GtkTreeIter iter;
    GtkTreeModel* model;
    
    //获得treeview中选中的一行的GtkTreeIter
    if (gtk_tree_selection_get_selected(GTK_TREE_SELECTION(widget), &model, &iter))
    {
        gtk_tree_model_get(model, &iter, DBLIST_ITEM, &dbvalue, -1);
        gtk_label_set_text(GTK_LABEL(label), dbvalue);
    }
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小陌白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值