簡體   English   中英

如何創建綁定qml到d?

[英]How to create bindings qml to d?

我想用dml語言使用qml。 但是沒有綁定到d,我想創建它。 但我不知道如何開始。 請告訴我,如何開始創建綁定。

既然沒有人回答:

據我所知, QMLQt的建模語言,我猜它在很大程度上取決於Qt 我假設這取決於Qt ,至少在某種程度上。

首先,已經嘗試將Qt綁定到Dhttp ://www.dsource.org/projects/qtd,但是從我聽到的這個項目有點死了而且不再開發(最后一次提交2年前) )。 你可以使用它作為基地,為你的工作或你如何結合參考QMLQt

1.選項,C / C ++膠水層

C-Glue Layer意味着,您基本上編寫了兩次代碼。 你寫一個完整的C++C在包裝C++ (可直接與界面的語言QtQml )。 這意味着你將一個類的每個方法都包裝在一個C函數中,它接受一個Pointer(代表這個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
}

你必須基本上為你想要在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);
     }
}

正如你現在所看到的,這很乏味......

假設你已經完成了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);
}

你在這個例子中看到一個問題,如果你想正確包裝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綁定的集合,可以作為參考)

在makind Qt過程的最后一步, Qml綁定將根據你新制作的C-Bindings Binding重建DOOP-Api

2.選項, SWIG / Binding生成器

我不是SWIG的專家,這就是我只用幾句話覆蓋它的原因。

您可以使用SWIG的是為您生成整個C/C++-Glue Layer thingy 如果你很幸運,你的SWIG-File只包括一些includes QtSWIG將為你完成的所有工作。 如果沒有,您必須自己定義ClassesFunctions規則,這可能是乏味的(但也比執行1. Option更容易和更快)。 所以SWIG絕對值得一試!

作為旁注:如果你有一個模板/宏/重/標題只有像glm SWIG這樣的C++庫可能會很棘手,或者在glm沒有選項的情況下。

還有其他Binding-Generators,例如PySide項目以Boost.Python開始,然后切換到Shiboken 我不知道除了CPython之外你能用Shiboken生成綁定有多么容易,也許是黑客攻擊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大會上的 第一次演講中提到如何使用D的元編程功能成功地從D綁定到C++

簡而言之

  • C/C++ Glue-Layer為您提供了最大的靈活性,它可以工作,但並不簡單,尤其是長期任務(我會為相當小的項目執行此操作)。
  • SWIG / Binding生成器,我將采用Qt ,一旦正確設置,它們就能為您完成所有工作(在最好的情況下)。
  • extern(C++) ,好主意,對於大多數嚴肅的C++項目來說太有限了。

我希望這能簡要概述一下您可以做什么以及它需要的工作量。

他們已經有一篇關於如何將C代碼與D接口的文章

通常並不難。 獲取函數聲明並將其放入extern(C)

通常這些模塊都寫入ac包。 例:

src/
`-- appName
    |-- c
    |   `-- dInterface.d
    `-- dwrapper.d

模塊appName.c.dInterface將使用extern(C)塊定義C函數而模塊ppName.dwrapper將提供更適合dlang的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM