2012-02-06 30 views
4

我試圖創建一個使用GtkBuilder和格萊德一個真的簡單的GUI。爲了實現這一點,我遵循官方的Gtk + 3參考手冊的教程。原碼唯一的區別是,我不連接到widget的信號,簡單(因此除去過多的回調函數):GtkBuilder忽略的.ui文件

#include <gtk/gtk.h> 

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

    gtk_init (&argc, &argv); 

    /* Construct a GtkBuilder instance and load our UI description */ 
    builder = gtk_builder_new(); 
    gtk_builder_add_from_file (builder, "builder.ui", NULL); 


    gtk_main(); 

    return 0; 
} 

在教程中使用的「builder.ui」文件的樣子這個:

 <interface> 
    <object id="window" class="GtkWindow"> 
    <property name="visible">True</property> 
    <property name="title">Grid</property> 
    <property name="border-width">10</property> 
    <child> 
     <object id="grid" class="GtkGrid"> 
     <property name="visible">True</property> 
     <child> 
      <object id="button1" class="GtkButton"> 
      <property name="visible">True</property> 
      <property name="label">Button 1</property> 
      </object> 
      <packing> 
      <property name="left-attach">0</property> 
      <property name="top-attach">0</property> 
      </packing> 
     </child> 
     <child> 
      <object id="button2" class="GtkButton"> 
      <property name="visible">True</property> 
      <property name="label">Button 2</property> 
      </object> 
      <packing> 
      <property name="left-attach">1</property> 
      <property name="top-attach">0</property> 
      </packing> 
     </child> 
     <child> 
      <object id="quit" class="GtkButton"> 
      <property name="visible">True</property> 
      <property name="label">Quit</property> 
      </object> 
      <packing> 
      <property name="left-attach">0</property> 
      <property name="top-attach">1</property> 
      <property name="width">2</property> 
      </packing> 
     </child> 
     </object> 
     <packing> 
     </packing> 
    </child> 
    </object> 
</interface> 

......並且根本沒有問題。該程序編譯並生成所需的窗口。但是,當我嘗試使用我自己的.ui文件(由glade 3.10.0生成)時,我根本沒有得到任何結果。應用程序進入主循環並且不出現窗口。我使用的GUI文件是:

<?xml version="1.0" encoding="UTF-8"?> 
<interface> 
    <!-- interface-requires gtk+ 3.0 --> 
    <object class="GtkWindow" id="Window"> 
    <property name="can_focus">False</property> 
    <property name="border_width">15</property> 
    <child> 
     <object class="GtkLabel" id="fooLabel"> 
     <property name="visible">True</property> 
     <property name="can_focus">False</property> 
     <property name="label" translatable="yes">foobar</property> 
     </object> 
    </child> 
    </object> 
</interface> 

我在做什麼錯?

回答

5

你只是讀取XML文件,你需要一些代碼,操縱用戶界面的東西,例如顯示頂層窗口在您的.ui:

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

    gtk_init (&argc, &argv); 

    builder = gtk_builder_new(); 
    gtk_builder_add_from_file (builder, "tutorial.xml", NULL); 
    window = GTK_WIDGET (gtk_builder_get_object (builder, "Window")); 
    g_object_unref (G_OBJECT (builder)); 
    gtk_widget_show (window);     
    gtk_main(); 

    return 0; 
} 
4

您的UI文件和教程UI文件之間的區別是這條線,在小部件的GtkWindow:

<property name="visible">True</property> 

沒有它,你的窗口(和它裏面的所有東西)都保持隱藏,所以這就是爲什麼「沒有」發生。窗戶在那裏,它只是看不見。該行

gtk_widget_show (window); 

在nos的解決方案也解決了這個問題,但這就是爲什麼教程文件工作,而你的沒有。

0

我有同樣的問題,但嘗試了上述所有的,但沒有成功。

我習慣了在Windows C++,但這是在raspbian的樹莓派一個G ++項目。

我唯一的解決辦法,到目前爲止是如下

gtk_builder_add_from_file (builder, "/home/pi/Documents/tutorial.xml", NULL); 

我隨後包括編譯器的路徑,但隨後再次沒有窗口中添加的完整路徑。

0

我有同樣的問題。在Ubuntu linux上顯示ok的簡單應用程序並未出現在Raspbian中。經過一些調試之後,看起來像Raspbian的GTKBuilder實現有一個bug。這是行不通的。

解決方案: 1)無論是手動轉換GUI描述XML到C/C++ API(GTK +)調用。 OR 2)編寫一個小程序將GUI XML文件轉換爲C/C++ API(GTK +)調用。

謝謝。