为了使用 Glib::wrap,必须对 Glib::init() 进行啥操作?

Posted

技术标签:

【中文标题】为了使用 Glib::wrap,必须对 Glib::init() 进行啥操作?【英文标题】:What has to be Glib::init()'ed in order to use Glib::wrap?为了使用 Glib::wrap,必须对 Glib::init() 进行什么操作? 【发布时间】:2010-07-13 02:14:25 【问题描述】:

所以我尝试使用GtkSourceViewmm 在 C++ 中使用 GtkSourceView,它的文档和支持级别给我的印象是它已经很长时间没有被仔细研究过了。但我总是一个乐观主义者:)

我正在尝试使用类似于以下的代码添加SourceView:

 Glib::RefPtr<gtksourceview::SourceLanguageManager> source_language_manager = gtksourceview::SourceLanguageManager::create();
 Glib::RefPtr<gtksourceview::SourceLanguage> source_language = Glib::wrap(gtk_source_language_manager_guess_language(source_language_manager->gobj(), file, NULL));
 Glib::RefPtr<gtksourceview::SourceBuffer> source_buffer = gtksourceview::SourceBuffer::create(source_language);
 gtksourceview::SourceView* = m_source_view = new gtksourceview::SourceView(source_buffer);

 m_vbox.pack_start(*m_source_view);

不幸的是,它吐出了警告

(algoviz:4992): glibmm-警告 **: 无法包装类型的对象 'GtkSourceLanguage'。提示:这个错误 通常是由于没有打电话引起的 一个库 init() 函数。

当我在调试器中查看它时,确实上面的第二行(带有Glib::wrap() 的那一行)正在返回NULL。我不知道为什么会这样,但我尝试通过在程序开头添加Glib::init() 来注意警告,但这似乎也没有任何帮助。

我已经尝试过 Google 搜索,但没有成功。有谁知道 Glib 想让我初始化什么以便能够进行 wrap 调用?或者,更好的是,有没有人知道任何使用 GtkSourceViewmm(不仅仅是常规 GtkSourceView)的工作示例代码?我无法找到任何实际的示例代码,甚至在 Google 代码搜索中也找不到。

谢谢!

【问题讨论】:

【参考方案1】:

事实证明,也许并不奇怪,我需要初始化的是:

gtksourceview::init();

在此之后,我在gtksourceview::SourceLanguageManager 的一个参数上遇到了另一个问题,但这是由我subsequently reported 的一个真正的错误引起的,并被及时修复。所以现在一切都很好!

【讨论】:

对于较新的版本,这将更改为 Gsv::init()。 要使用 Gsv::init(),需要包含 gtksourceviewmm.h【参考方案2】:

我使用 gtkmm。通常,您必须使用以下内容进行初始化:

_GTKMain = new Gtk::Main(0, 0, false);

当然不要忘记:

delete _GTKMain;

查看这里了解详情:

http://library.gnome.org/devel/gtkmm/2.19/classGtk_1_1Main.html

(抱歉,链接选项不起作用...)

【讨论】:

以上是关于为了使用 Glib::wrap,必须对 Glib::init() 进行啥操作?的主要内容,如果未能解决你的问题,请参考以下文章

Glib 对 C 函数进行单元测试

如何对使用 G_DECLARE_DERIVABLE_TYPE (glib/gobject) 定义的类进行子类化

gstreamer移植qnx:交叉编译glib

在 glib dbus 中正确使用 GPtrArray 和 GValueArray

如何使用 glib/gio 监控根目录?

如何控制 glib 中调试信息的级别?