在C++中实现GObject接口

Mei*_*bur 6 c++ glib gtkmm

我尝试使用Glibmm(Gtkmm的一部分)在C++中实现GType接口.该对象将被传递给C中的API.不幸的是,gtkmm 的文档没有涵盖它如何包装GObject系统的许多细节.

到目前为止我所拥有的:

class MonaCompletionProvider : public gtksourceview::SourceCompletionProvider, public Glib::Object
{
    public:
        MonaCompletionProvider();
        virtual ~MonaCompletionProvider();

        Glib::ustring get_name_vfunc() const;
        // ... and some more
}
Run Code Online (Sandbox Code Playgroud)

所有方法和构造函数实现都是空的.代码使用如下:

Glib::RefPtr<MonaCompletionProvider> provider(new MonaCompletionProvider());
bool success = completion->add_provider(provider);
Run Code Online (Sandbox Code Playgroud)

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

Mei*_*bur 5

最后,我找到了解决方案.

类定义(子类的顺序很重要):

class MonaCompletionProvider : public Glib::Object, public gtksourceview::SourceCompletionProvider {
...
Run Code Online (Sandbox Code Playgroud)

构造函数(再次,订单事项):

MonaCompletionProvider::MonaCompletionProvider() :
    Glib::ObjectBase(typeid(MonaCompletionProvider)),
    Glib::Object(),
    gtksourceview::SourceCompletionProvider() {
...
Run Code Online (Sandbox Code Playgroud)

通过检查Guikachu的工作方式找到解决方案.