【问题标题】:Implementing a GObject interface in C++在 C++ 中实现 GObject 接口
【发布时间】:2011-02-13 16:44:52
【问题描述】:

我尝试使用 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 将在执行此代码后为假,并在命令行中出现以下消息:

(monagui:24831): GtkSourceView-CRITICAL **: gtk_source_completion_add_provider: 断言 `GTK_IS_SOURCE_COMPLETION_PROVIDER (提供者)'失败

似乎底层的gobj() 并不知道它应该实现这个接口。如果类不是从Glib::Object 派生的,gobj() 甚至会返回 null。我希望我不必在 C 中手动编写实现此接口的 GObject。

那么正确的方法是什么?提前致谢。

PS:有兴趣的朋友:SourceCompletionProvider

【问题讨论】:

标签: c++ glib gtkmm


【解决方案1】:

终于找到了解决办法。

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

class MonaCompletionProvider : public Glib::Object, public gtksourceview::SourceCompletionProvider {
...

构造函数(同样,顺序很重要):

MonaCompletionProvider::MonaCompletionProvider() :
    Glib::ObjectBase(typeid(MonaCompletionProvider)),
    Glib::Object(),
    gtksourceview::SourceCompletionProvider() {
...

通过检查 Guikachu 中的完成方式找到了解决方案。

【讨论】:

  • 对不起,SO 敦促我接受一个答案,即使它是我自己的(虽然不给分)
猜你喜欢
  • 2023-03-10
  • 2018-10-03
  • 2012-02-01
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多