gtk3关于GtkEntry极其奇怪的问题

⌚Time: 2025-08-13 15:50:00

👨‍💻Author: Jack Ge

我在一个函数里创建gtkentry,并且在2个notebook页面使用这个函数创建gtkentry,直接发生了崩溃。但是如果设置placeholder,就不会有任何问题,代码就是下面的:

#include <gtk/gtk.h>

GtkWidget* get_language_page() {
    GtkWidget* page = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
    GtkWidget* labelName = gtk_label_new("Name");
    
    gtk_box_pack_start(GTK_BOX(page), labelName, FALSE, FALSE, 5);

    GtkWidget *nameEntry = gtk_entry_new();
    // 必须设置placeholder,即使是空字符串
    gtk_entry_set_placeholder_text(GTK_ENTRY(nameEntry), "请输入内容...");
    gtk_box_pack_start(GTK_BOX(page), nameEntry, FALSE, FALSE, 5);
    
    return page;
}

int main(int argc, char *argv[]) {
    gtk_init(&argc, &argv);
    
    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "Notebook Example");
    gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    
    GtkWidget *notebook = gtk_notebook_new();
    gtk_container_add(GTK_CONTAINER(window), notebook);
    
    // 添加两个页面
    GtkWidget *page1 = get_language_page();
    GtkWidget *page2 = get_language_page();
    
    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page1, gtk_label_new("Page 1"));
    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page2, gtk_label_new("Page 2"));
    
    gtk_widget_show_all(window);
    gtk_main();
    
    return 0;
} 

有视频为证

后来我直接不用函数了,直接在代码里直接创建,还是一样的问题:

#include <gtk/gtk.h>


int main(int argc, char *argv[]) {
    gtk_init(&argc, &argv);
    
    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "Notebook Example");
    gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    
    GtkWidget *notebook = gtk_notebook_new();
    gtk_container_add(GTK_CONTAINER(window), notebook);
    
    // 添加两个页面
    GtkWidget *page1 = gtk_entry_new();
    GtkWidget *page2 = gtk_entry_new();

    //不加placeholder直接崩溃,加了就没有问题
    gtk_entry_set_placeholder_text(GTK_ENTRY(page1), "请输入内容..."); 
    gtk_entry_set_placeholder_text(GTK_ENTRY(page2), "请输入内容..."); 
    
    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page1, gtk_label_new("Page 1"));
    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page2, gtk_label_new("Page 2"));
    
    gtk_widget_show_all(window);
    gtk_main();
    
    return 0;
} 

下午我又发现了一个问题,几乎与上一个gtkentry是同样的类型。

在2个notebook页面,使用函数创建内容。并且函数里都创建了一个GtkTextView,结果就是,在切换页面的时候竟然textview的内容自己消失了。并且不能编辑textview。我怎么问AI,怎么改都没有用。

上一个gtkentry奇怪的加了placeholder就能用了。这个GtkTextView根本没有placeholder的属性。


我想起之前下载gtk3的时候好像是看到过一句话,某个版本有严重问题。我就想到换版本,最后我换了gtk3的版本。原版是gtk+-bundle_3.4.2-20130513_win32这个版本,我换成了gtk+-bundle_3.6.4-20130513_win32,结果编译运行没有任何错误,所有的问题都解决了。

原来就是gtk版本的问题。我不知道这么缺陷的版本问题这么明显竟然还能发布。

所以我的结论就是gtk+-bundle_3.4.2-20130513_win32是有严重问题的版本不能用。