我尝试使用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
最后,我找到了解决方案.
类定义(子类的顺序很重要):
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的工作方式找到解决方案.
| 归档时间: |
|
| 查看次数: |
1289 次 |
| 最近记录: |