2017-10-16 88 views
2

我想通过一个'显示'信号的信号处理程序从GSettings初始化一个GtkEntry小部件。这在手动构建用户界面时按预期工作,但在使用GtkBuilder时无法工作。这同样适用于其他GtkWidget信号; GtkEntry信号按预期工作。它看起来像信号永远不会发射?使用GtkBuilder构建的GUI不会发出信号'show'?

#include <gtk/gtk.h> 


void activated (GtkEntry *entry, 
       gpointer user_data){ 

    GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(user_data), GTK_DIALOG_DESTROY_WITH_PARENT, 
               GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, 
               gtk_entry_get_text(entry)); 
    gtk_dialog_run(GTK_DIALOG(dialog)); 
    gtk_widget_destroy(dialog); 

} 



void shown (GtkWidget *widget, 
       gpointer user_data){ 
    GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(user_data), GTK_DIALOG_DESTROY_WITH_PARENT, 
               GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, 
               "SHOWN!"); 
    gtk_dialog_run(GTK_DIALOG(dialog)); 
    gtk_widget_destroy(dialog); 

} 



int main(int argc, char **argv){ 
    GtkWidget *window1, *window2, *entry; 
    GtkBuilder *builder; 


    gtk_init(&argc, &argv); 

    // Construct working window 1 

    window1 = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_title(GTK_WINDOW(window1),"Working"); 
    entry=gtk_entry_new(); 

    g_signal_connect(entry, "activate", G_CALLBACK(activated), window1); 
    g_signal_connect(entry, "show", G_CALLBACK(shown), window1); 

    gtk_container_add(GTK_WINDOW(window1), entry); 


    // Construct not working window 2 

    builder=gtk_builder_new_from_file ("window.glade"); 
    window2 = GTK_WIDGET(gtk_builder_get_object(builder, "window2")); 
    gtk_builder_connect_signals(builder, NULL); 
    g_object_unref(builder); 


    gtk_widget_show_all(window1); 
    gtk_widget_show_all(window2); 


    gtk_main(); 

    return 0; 
} 

window.glade:

<?xml version="1.0" encoding="UTF-8"?> 
<!-- Generated with glade 3.18.3 --> 
<interface> 
    <requires lib="gtk+" version="3.12"/> 
    <object class="GtkWindow" id="window2"> 
    <property name="can_focus">False</property> 
    <property name="title" translatable="yes">Not working</property> 
    <child> 
     <object class="GtkEntry" id="entry1"> 
     <property name="visible">True</property> 
     <property name="can_focus">True</property> 
     <property name="shadow_type">none</property> 
     <signal name="activate" handler="activated" object="window2" swapped="no"/> 
     <signal name="show" handler="shown" object="window2" swapped="no"/> 
     </object> 
    </child> 
    </object> 
</interface> 
+0

刚一说明。据我所知,将** map **事件用于拟用于演出的目的会更好。这与** show **一模一样,不需要改变空地中的任何东西。并且节目被称为“不,不是真的,这是来自 之前的那些奇怪的历史事物之一”。你可以查看这个链接https://blogs.gnome.org/jnelson/2010/10/13/those-realize-map-widget-signals/ – likern

回答

1

设置可见标志GLADE为false(勾去掉)使得当GtkBuilder实例glade文件内容,未示出的工具;那么当你对window2gtk_widget_show_all时,信号就会消失。

enter image description here

另外,编辑window.glade和Visible属性设为False或删除它(我觉得默认的窗口小部件是不可见的),例如:

... 
<object class="GtkEntry" id="entry1"> 
    <property name="visible">False</property> 
... 
+0

适合我,谢谢! – eezacque