2017-08-14 178 views
1

我想在我的項目中使用Glade生成一個包含窗口,網格的文件......但是當我嘗試聽我點擊按鈕上的事件時,我不明白爲什麼:■C - GTKUibuilder - 林間空地 - g_signal_connect錯誤

我得到了這些錯誤..

GLib-GObject-WARNING **: invalid (NULL) pointer instance 

(test:5608): GLib-GObject-CRITICAL **: g_signal_connect_data: assertion 'G_TYPE_CHECK_INSTANCE (instance)' failed 

...每一個聽者。

所以,我的文件名爲 「project_ui.ui」 在同一目錄設置爲我的main.c:

<?xml version="1.0" encoding="UTF-8"?> 
<!-- Generated with glade 3.20.0 --> 
<interface> 
    <requires lib="gtk+" version="3.20"/> 
    <object class="GtkWindow"> 
    <property name="visible">True</property> 
    <property name="can_focus">False</property> 
    <child> 
     <object class="GtkGrid"> 
     <property name="visible">True</property> 
     <property name="can_focus">False</property> 
     <child> 
      <object class="GtkButton"> 
      <property name="label" translatable="yes">Button 1</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      </object> 
      <packing> 
      <property name="left_attach">1</property> 
      <property name="top_attach">0</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkButton"> 
      <property name="label" translatable="yes">Button 2</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      </object> 
      <packing> 
      <property name="left_attach">2</property> 
      <property name="top_attach">0</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkButton"> 
      <property name="label" translatable="yes">Button 0</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      </object> 
      <packing> 
      <property name="left_attach">0</property> 
      <property name="top_attach">0</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkButton"> 
      <property name="label" translatable="yes">Quit</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      </object> 
      <packing> 
      <property name="left_attach">0</property> 
      <property name="top_attach">1</property> 
      <property name="width">3</property> 
      </packing> 
     </child> 
     </object> 
    </child> 
    </object> 
</interface> 

我的main.c包含以下代碼:

#include <stdio.h> 
#include <gtk-3.0/gtk/gtk.h> 


static void printHello (GtkWidget *widget, gpointer data){ 
    g_print("Hello World \n"); 
} 

int main(int argc, char *argv[]) { 
    GtkBuilder *builder; 
    GObject *window; 
    GObject *button; 

    gtk_init(&argc,&argv); 

    builder = gtk_builder_new(); 
    gtk_builder_add_from_file(builder, "project_ui.ui", NULL); 

    window = gtk_builder_get_object(builder, "window"); 
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); 

    //Button 1 
    button = gtk_builder_get_object(builder, "Button 1"); 
    g_signal_connect(button, "clicked", G_CALLBACK(printHello), NULL); 

    //Button 2 
    button = gtk_builder_get_object(builder, "Button 2"); 
    g_signal_connect(button, "clicked", G_CALLBACK(printHello), NULL); 

    //Button 0 
    button = gtk_builder_get_object(builder, "Button 0"); 
    g_signal_connect(button, "clicked", G_CALLBACK(printHello), NULL); 

    //button Quit 
    button = gtk_builder_get_object(builder, "Quit"); 
    g_signal_connect_swapped(button, "clicked", G_CALLBACK(gtk_widget_destroy), window); 

    gtk_main(); 
    return 0; 
} 

是有人有任何想改正它?

+0

我只是試圖按照此示例:https://developer.gnome.org/gtk3/stable/ch01s03.html &得到了完全相同的錯誤...信號不希望聽按鈕:■ – nodeover

+0

根據錯誤信息提供'NULL'指針。顯然,連接信號時沒有問題,而是從GUI中檢索對象。你可能會檢查你的返回值爲'NULL'poiners。 – Gerhardh

+0

您可以檢查'gtk_builder_add_from_file'的返回值作爲開始。建設者是否甚至可以找到你的UI文件? – Gerhardh

回答

2

我用我的Ubuntu機器用Gtk 3.18試過了。

當我打開你的文件格萊德我不明白在UI的任何消息,但我得到的shell錯誤消息:

(空地:2996):GladeUI-WARNING **:文件沒有包含所需的屬性「id」在「object」標籤下。

這是一個很好的提示。 如果你在你的例子,你看看鏈接,你會發現這一點:

<object id="button2" class="GtkButton"> 

你只有這一點:

<object class="GtkButton"> 

沒有ID的gtk_builder不知道如何找到這個小程序。

因爲你用錯誤的值進行搜索您的小工具:

button = gtk_builder_get_object(builder, "Button 1"); 

這只是按鈕上顯示的文本。你需要使用的是缺少的id。 該示例使用此代碼:

button = gtk_builder_get_object (builder, "button1"); 

在這裏,ID被用於檢索指針窗口小部件。

要解決您的問題,您需要將ID添加到您的小部件,並使用這些ID檢索它們而不是標籤上的文本。

+0

謝謝!這是我的案例的答案的90%, 事實上,我必須指出我的UI文件的確切路徑,它不適用於相對路徑:s – nodeover