![](/img/trans.png)
[英]c gtk+-2 glade3: adding text to a combobox loaded from Gtk Builder
[英]C Gtk+2 Glade3: how can i set a SourceBuffer to a GtkSourceView that was loaded from glade?
我正在尝试将.c文件加载到GtkSourceView
小部件中。
在Gtk + 2.22.1和Glade 3.6.7和GtkSourceView 2.10.1中使用C语言。
我注意到在Glade UI中,我只能配置SourceView
来容纳TextBuffer
; 我没有找到SourceBuffer
组件。 因此,我在Glade中创建了一个没有默认缓冲区的SourceView
。 现在,我想将SourceBuffer
设置为SourceView
组件的缓冲区。
gtk_source_view_new_with_buffer()
是我发现将SourceBuffer
附加到SourceView
的唯一方法。 问题在于此函数正在创建SourceView
并且我想将SourceBuffer
附加到使用Glade构建的已经创建的SourceView
。 我怎样才能做到这一点?
我没有粘贴任何代码,因为没有代码可显示。 我刚刚创建了一个Glade文件,其中包含一些UI组件以及ID为gtk_sourceview
的SourceView-2
组件。
在C文件中,我使用
GtkSourceView *sourceview = GTK_WIDGET (gtk_builder_get_object (builder, "gtk_sourceview"));
缺少的是如何创建SourceBuffer
并将其附加到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
我该怎么解决?
谢谢!
GtkSourceView
已经有一个缓冲区。 以与获取常规文本缓冲区相同的方式获取它:
GtkSourceBuffer *buffer = GTK_SOURCE_BUFFER(gtk_text_view_get_buffer(GTK_TEXT_VIEW(source_view)));
这是因为GtkSourceView
是GtkTextView
的子类,因此文本视图功能也可以在其上工作。
编辑 :
这是一个有效的程序和林间空地文件。
程序:
#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;
}
Glade文件:
<?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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.