2011-02-27 48 views
1

我試圖將一個.c文件加載到GtkSourceView小部件中。C Gtk + 2 Glade3:我如何將SourceBuffer設置爲從glade加載的GtkSourceView?

使用C語言,使用Gtk + 2.22.1和Glade 3.6.7和GtkSourceView 2.10.1。

我注意到在Glade UI中我只能配置一個SourceView來保存TextBuffer;我沒有找到SourceBuffer組件。所以,我在Glade中創建了一個SourceView,沒有默認緩衝區。現在我想將SourceBuffer設置爲我的SourceView組件的緩衝區。

gtk_source_view_new_with_buffer()是我發現將SourceBuffer附加到SourceView的唯一方法。問題是此函數創建SourceView,我想將SourceBuffer附加到已創建的使用Glade構建的SourceView。我怎樣才能做到這一點?

我沒有粘貼任何代碼,因爲沒有代碼顯示。我剛創建了一個帶有一些UI組件的Glade文件,加上編號爲gtk_sourceviewSourceView-2組件。

在C文件我取得與

GtkSourceView *sourceview = GTK_WIDGET (gtk_builder_get_object (builder, "gtk_sourceview")); 

現在缺少的是如何創建一個SourceBuffer並將其連接到SourceView組件SourceView組件。

謝謝!

更新:我嘗試使用:

GtkSourceBuffer *sourcebuffer = GTK_SOURCE_BUFFER(gtk_text_view_get_buffer(GTK_TEXT_VIEW(sourceview))); 

,但我得到了以下斷言錯誤:

(tour_de_gtk:13884): Gtk-CRITICAL **: IA__gtk_text_view_get_buffer: assertion `GTK_IS_TEXT_VIEW (text_view)' failed 

我能做些什麼來解決這個問題?

謝謝!

+0

你得到任何編譯警告,從我的角度來看,你應該得到至少一個約兼容的指針decalring和設置sorucebuffer – drahnr 2011-03-02 17:21:36

回答

3

GtkSourceView已經有一個緩衝區。獲得同樣的方式你得到一個普通的文本緩衝區:

GtkSourceBuffer *buffer = GTK_SOURCE_BUFFER(gtk_text_view_get_buffer(GTK_TEXT_VIEW(source_view))); 

這是因爲GtkSourceViewGtkTextView子類,所以文本視圖功能就可以工作了。

編輯

這裏是一個程序和空地文件工作。

計劃:

#include <gtk/gtk.h> 
#include <gtksourceview/gtksourceview.h> 
#include <gtksourceview/gtksourcebuffer.h> 
#include <gtksourceview/gtksourcelanguagemanager.h> 

int 
main(int argc, char **argv) 
{ 
    gtk_init(&argc, &argv); 

    GtkBuilder *builder = gtk_builder_new(); 
    if(gtk_builder_add_from_file(builder, "sourceview.ui", NULL) == 0) 
     g_error("In real code, you would handle an error here"); 
    gtk_builder_connect_signals(builder, NULL); 

    GtkWidget *window = GTK_WIDGET(gtk_builder_get_object(builder, "window")); 
    GtkSourceView *sourceview = GTK_SOURCE_VIEW(gtk_builder_get_object(builder, "gtk_sourceview")); 

    /* Get the buffer */ 
    GtkSourceBuffer *sourcebuffer = GTK_SOURCE_BUFFER(gtk_text_view_get_buffer(GTK_TEXT_VIEW(sourceview))); 

    /* Do stuff to the buffer, to prove we've really got the GtkSourceBuffer */ 
    gtk_text_buffer_set_text(GTK_TEXT_BUFFER(sourcebuffer), 
     "def hello():\n\tprint 'This should be highlighted as Python'\n", -1); 
    GtkSourceLanguageManager *manager = gtk_source_language_manager_get_default(); 
    GtkSourceLanguage *python = gtk_source_language_manager_get_language(manager, "python"); 
    gtk_source_buffer_set_language(sourcebuffer, python); 

    /* Okay, that should prove it, now run the program */ 
    gtk_widget_show_all(window); 
    gtk_main(); 

    return 0; 
} 

格萊德文件:

<?xml version="1.0" encoding="UTF-8"?> 
<interface> 
    <!-- interface-requires gtksourceview 3.0 --> 
    <requires lib="gtk+" version="2.20"/> 
    <!-- interface-naming-policy project-wide --> 
    <object class="GtkSourceBuffer" id="gtksourcebuffer"> 
    <property name="max_undo_levels">0</property> 
    </object> 
    <object class="GtkWindow" id="window"> 
    <property name="default_width">300</property> 
    <property name="default_height">300</property> 
    <signal name="destroy" handler="gtk_main_quit" swapped="no"/> 
    <child> 
     <object class="GtkScrolledWindow" id="scrolledwindow"> 
     <property name="visible">True</property> 
     <property name="can_focus">True</property> 
     <property name="hscrollbar_policy">automatic</property> 
     <property name="vscrollbar_policy">automatic</property> 
     <child> 
      <object class="GtkSourceView" id="gtk_sourceview"> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="left_margin">2</property> 
      <property name="right_margin">2</property> 
      <property name="buffer">gtksourcebuffer</property> 
      <property name="tab_width">4</property> 
      <property name="auto_indent">True</property> 
      <property name="indent_on_tab">False</property> 
      </object> 
     </child> 
     </object> 
    </child> 
    </object> 
</interface> 
+0

當我得到一些錯誤..我更新主要帖子更多的信息 – ufk 2011-03-01 23:13:09

+1

我明白了;這是一個錯誤。在GtkBuilder中,'GtkSourceView'是用一個'GtkTextBuffer'緩衝區創建的,而不是如果你手動創建這個小部件會發生什麼。我寫了一個可行的程序;您必須在Glade中創建'GtkSourceBuffer'並將其添加到源視圖窗口小部件中。看我的編輯。 – ptomato 2011-03-02 21:52:15

+1

供將來參考:https://bugzilla.gnome.org/show_bug.cgi?id = 643732 – ptomato 2011-03-02 22:14:40