数据库展示页面
windows+visualstudio2019配置GTK3教程
完成的功能:
- 删除指定数据库
- 新建一个数据库
界面图:
#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;
GtkWidget* entrydb; // 接收用户输入的新建数据库名称
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); // 数据库展示列表点击回调函数
void db_clicked_delete(GtkWidget* widget, gpointer select); // 删除数据库按钮回调函数
void db_clicked_new(GtkWidget* widget, gpointer entry); // 新建数据库的回调函数
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);
GtkWidget* toolbar = gtk_toolbar_new();
GtkToolItem* btn1 = gtk_tool_button_new(NULL, _2("新建"));
gtk_tool_button_set_stock_id(GTK_TOOL_BUTTON(btn1), GTK_STOCK_ADD);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), btn1, 0);
GtkToolItem* btn2 = gtk_tool_button_new(NULL, _2("删除"));
gtk_tool_button_set_stock_id(GTK_TOOL_BUTTON(btn2), GTK_STOCK_DELETE); // 加图标
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), btn2, 1);
GtkToolItem* btn3 = gtk_tool_button_new(NULL, _2("选择"));
gtk_tool_button_set_stock_id(GTK_TOOL_BUTTON(btn3), GTK_STOCK_CONNECT); // 加图标
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), btn3, 2);
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), toolbar, true, true, 5);
entrydb = gtk_entry_new();
gtk_box_pack_start(GTK_BOX(db_box), entrydb, true, true, 5);
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);
g_signal_connect(btn2, "clicked", G_CALLBACK(db_clicked_delete), selection);
g_signal_connect(btn1, "clicked", G_CALLBACK(db_clicked_new), db_list);
gtk_widget_set_size_request(window_database, 400, 500);
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);
}
}
void db_clicked_delete(GtkWidget* widget, gpointer select)
{
GtkTreeIter iter;
GtkTreeModel* model;
//获得treeview中选中的一行的GtkTreeIter
if (gtk_tree_selection_get_selected(GTK_TREE_SELECTION(select), &model, &iter))
{
int t;
char query[50];
sprintf(query, "drop database %s", dbvalue);
t = mysql_real_query(conn_prt, query, strlen(query));
if (t)
{
printf("failed to drop database:%s\n", mysql_error(conn_prt));
return;
}
gtk_list_store_remove(GTK_LIST_STORE(model), &iter); // 数据库删除成功之后执行
}
}
void db_clicked_new(GtkWidget* widget, gpointer list)
{
const char* name = gtk_entry_get_text(GTK_ENTRY(entrydb));
int t;
char query[50];
sprintf(query, "create database %s", name);
t = mysql_real_query(conn_prt, query, strlen(query));
if (t)
{
printf("failed to create database:%s\n", mysql_error(conn_prt));
return;
}
add_to_dblist(GTK_WIDGET(list), _2(name));
}
下一步:制作数据库表展示页面,在选择某个数据库之后展示该数据库下的表。