如何创建绑定qml到d?

Yar*_*lka 3 binding qt d qml

我想用dml语言使用qml.但是没有绑定到d,我想创建它.但我不知道如何开始.请告诉我,如何开始创建绑定.

dav*_*v1d 6

既然没有人回答:

从我的理解QML是建模语言,Qt我想它在很大程度上取决于Qt.我认为这取决于Qt,至少在某种程度上.

首先,已经尝试绑定QtD:http://www.dsource.org/projects/qtd,但是从我听到的这个项目有点死了而且不再开发(2年前的最后一次提交).你可以使用它作为基地,为你的工作或你如何参考可以绑定QMLQt.

1.选项,C/C++胶水层

C-Glue Layer意味着,您基本上编写了两次代码.你写一个完整的C++C包装器中C++(可直接与界面的语言QtQml).这意味着你将一个类的每个方法都包装在一个C带有指针的函数中(对于一个表示这个的结构C++ Qt class).这看起来像这样(注意这是GtkWebkit的抽象,用C语言编写,但代码片段演示了如何做得很好):

// somewhere in a header
typedef struct SurfiClient {
    GtkWidget *window; // Offscreen window
    // ....
}

typedef GdkPixbuf Pixbuf;

extern "C" {
    Pixbuf* surfi_client_get_pixbuf(SurfiClient* client)
    {
        // in C++ this would gtk_offscreen_window_get_pixbuf would be a method of client->window
        return gtk_offscreen_window_get_pixbuf(GTK_OFFSCREEN_WINDOW(client->window));
    }

    // here go the rest of these functions, probably thousands
}
Run Code Online (Sandbox Code Playgroud)

你必须基本上为你想要在D面接口的所有东西做这个.更糟糕的是,您还必须为namespaces未标记的免费功能执行此操作extern "C",这可能看起来像这样(libsquish):

typedef unsigned char u8;
extern "C" {
     void CompressMasked(u8 const* rgba, int mask, void* block, int flags) {                    
         squish::CompressMasked(rgba, mask, block, flags);
     }
}
Run Code Online (Sandbox Code Playgroud)

正如你现在所看到的,这很乏味......

让我们假设您已经完成了C/C++Glue-Layer,现在您必须创建D可以连接它的代码.

留下这个gtk例子:

extern(C) {
    // Using an opaque struct is one option
    struct SurfiClient;

    // the other is to wrap the struct correctly
    struct SurfiClient {
        GtkWidget *window;
    }

    // The Pixbuf was only a typedef to GdkPixbuf which is already an opaque data structure, easy
    struct Pixbuf;


    Pixbuf* surfi_client_get_pixbuf(SurfiClient* client);
}
Run Code Online (Sandbox Code Playgroud)

你在这个例子中看到一个问题,如果你想SurfiClient正确地包装结构,你还必须包装GtkWidget或错误地使用void*而不是使用GtkWidget*,这不是问题的真正解决方案.你很可能也遇到这个问题,你的Glue-Layer结构有你没有抽象的成员,我会带着不透明的结构去这里,并为用户真正需要的成员提供功能.

我没有详细介绍如何与C接口,已经有一些指南:

  1. http://dlang.org/interfaceToC.html
  2. http://www.gamedev.net/blog/1140/entry-2254003-binding-d-to-c/
  3. https://github.com/D-Programming-Deimos(不是指南,而是C绑定的集合,可以作为参考)

在人类对付的过程的最后一步Qt,Qml绑定将是重建OOP-ApiD根据你的新作C-Bindings.

2.选项,SWIG/绑定生成器

我不是专家SWIG,这就是为什么我只用几句话覆盖它的原因.

您可以使用SWIG的是C/C++-Glue Layer thingy为您生成整体.如果你很幸运,你SWIG-File只会有几个人includes,QtSWIG会为你完成所有的工作.如果没有,你必须定义的规则Classes,并Functions在您自己的,它可以是(比做也更容易和更快的乏味1. Option).所以SWIG绝对值得一试!

作为旁注:如果你有一个模板/宏/重/只有标题C++库可能会很棘手或没有选项.glm SWIGglm

还有其他绑定生成器,例如PySide项目Boost.Python随后开始转换为Shiboken.我不知道你是否可以轻松地Shiboken为其他任何东西生成绑定CPython,也许是入侵Shiboken甚至Boost.Python可以工作?另外值得一读:http://setanta.wordpress.com/binding-c/.

QtD使用QtJambi所以这可能是一个好的开始.

3.选项,D方式

D有一个很棒的想法extern(C++),它允许在理论上制作C++/D没有这样的Glue-Layer的绑定:http://dlang.org/cpp_interface.html.

好主意,但不幸的是太有限了.例如,还没有对命名空间的支持(bugzilla上有一个开放的问题,我现在找不到).在我看来extern(C++),Qt太有限了.

Manu Evans在D大会上的第一次演讲中提到如何使用s元编程功能成功地与D 绑定.C++D

简而言之

  • 一个C/C++胶水层为您提供了最大的灵活性,它会工作,但没有简单的,尤其是一项艰巨的任务(我会为相当小的项目做到这一点).
  • SWIG/Binding生成器,我会采用的方式Qt,一旦正确设置,他们会为您完成所有工作(在最好的情况下).
  • extern(C++)好主意,对于大多数严肃的C++项目来说太有限了.

我希望这能简要概述一下您可以做什么以及它需要的工作量.