GTK 3 NoteBook标签关闭按钮页码获取错误、关闭顺序异常求助
问题原因
你调用gtk_notebook_page_num()时传入的第二个参数是按钮控件本身,但该接口要求传入的是Notebook的页关联控件:要么是页的内容控件(也就是你代码里作为gtk_notebook_append_page第二个参数的scrollwindow),要么是页的标签控件(gtk_notebook_append_page第三个参数的标签盒)。你的按钮放在标签栏的标签容器内部,不属于页内容的子控件,所以传入按钮的话该接口永远返回-1。而GTK规定向gtk_notebook_remove_page传入-1时会删除最后一页,这就是你总是倒序关闭标签的根本原因。
修复方案
下面提供两种可行的修复方式:
方案1:信号绑定时传递对应页的关联控件
直接在绑定按钮点击信号时,把对应页的内容控件作为用户数据传给回调函数,逻辑最简单:
- 修改
add_tab函数中的信号连接代码:
// 替换原有的g_signal_connect逻辑 g_signal_connect(GTK_WIDGET(button), "clicked", G_CALLBACK(close_tab), scrollwindow); // 传入当前页的内容控件作为用户数据
- 调整
close_tab回调的实现:
void close_tab(GtkWidget *button, gpointer data){ GtkWidget *page_content = data; gint pg_num = gtk_notebook_page_num(GTK_NOTEBOOK(notebook), page_content); if (pg_num >= 0) { // 增加合法性判断避免异常崩溃 gtk_notebook_remove_page(GTK_NOTEBOOK(notebook), pg_num); } }
方案2:通过按钮的父组件获取标签控件查询页码
如果不想修改信号绑定的传参,也可以直接通过按钮的父组件拿到标签盒,再查询对应页码:
// 无需修改add_tab逻辑,直接替换close_tab的实现 void close_tab(GtkWidget *button, gpointer data){ // 按钮的直接父容器就是你封装了标签文本和关闭按钮的横向盒,也就是页的标签控件 GtkWidget *tab_label = gtk_widget_get_parent(button); gint pg_num = gtk_notebook_page_num(GTK_NOTEBOOK(notebook), tab_label); if (pg_num >= 0) { gtk_notebook_remove_page(GTK_NOTEBOOK(notebook), pg_num); } }
额外注意
你现有代码的button_click函数中,if (strcmp(btn, "New") == 0);末尾多写了一个多余的分号,会导致判断逻辑失效,无论传入的参数是什么都会执行add_tab,建议删掉这个分号。
内容的提问来源于stack exchange,提问作者Arthur
相关产品推荐
相关产品推荐

