我尝试使用Glibmm(Gtkmm的一部分)在C ++中实现GType接口。该对象将被传递给C中的API。不幸的是,gtkmm的documentation没有涵盖它如何包装GObject系统的许多细节。
到目前为止我所拥有的:
class MonaCompletionProvider : public gtksourceview::SourceCompletionProvider, public Glib::Object
{
public:
MonaCompletionProvider();
virtual ~MonaCompletionProvider();
Glib::ustring get_name_vfunc() const;
// ... and some more
}
所有方法和构造函数实现都是空的。代码使用如下:
Glib::RefPtr<MonaCompletionProvider> provider(new MonaCompletionProvider());
bool success = completion->add_provider(provider);
执行此代码后, success
将为false,并且命令行中会显示以下消息:
(monagui:24831): GtkSourceView-CRITICAL **: gtk_source_completion_add_provider: 断言 `GTK_IS_SOURCE_COMPLETION_PROVIDER (提供者)'失败
基础gobj()
似乎不知道它应该实现这个接口。如果类不是从Glib::Object
派生的,gobj()
甚至会返回null。我希望我不必手动编写在C中实现此接口的GObject。
那么这样做的正确方法是什么?提前谢谢。
PS:对于有兴趣的人:SourceCompletionProvider
答案 0 :(得分:5)
最后,我找到了解决方案。
类定义(子类的顺序很重要):
class MonaCompletionProvider : public Glib::Object, public gtksourceview::SourceCompletionProvider {
...
构造函数(再次,订单很重要):
MonaCompletionProvider::MonaCompletionProvider() :
Glib::ObjectBase(typeid(MonaCompletionProvider)),
Glib::Object(),
gtksourceview::SourceCompletionProvider() {
...
通过检查Guikachu中的完成方式找到解决方案。