gpt4 book ai didi

C Gtk+2 Glade3 : how can i set a SourceBuffer to a GtkSourceView that was loaded from glade?

转载 作者:太空宇宙 更新时间:2023-11-04 02:17:39 25 4
gpt4 key购买 nike

我正在尝试将 .c 文件加载到 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。我该怎么做?

我没有粘贴任何代码,因为没有可显示的代码。我刚刚创建了一个 Glade 文件,其中包含一些 UI 组件以及 ID 为 gtk_sourceviewSourceView-2 组件。

在 C 文件中,我使用

获取 SourceView 组件
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)));

这是因为 GtkSourceViewGtkTextView 的子类,所以 TextView 函数也适用于它。

编辑:

这是一个有效的程序和 glade 文件。

程序:

#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>

关于C Gtk+2 Glade3 : how can i set a SourceBuffer to a GtkSourceView that was loaded from glade?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5133183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com