[英]How to create bindings qml to d?
我想用dml語言使用qml。 但是沒有綁定到d,我想創建它。 但我不知道如何開始。 請告訴我,如何開始創建綁定。
既然沒有人回答:
據我所知, QML
是Qt
的建模語言,我猜它在很大程度上取決於Qt
。 我假設這取決於Qt
,至少在某種程度上。
首先,已經嘗試將Qt
綁定到D
: http ://www.dsource.org/projects/qtd,但是從我聽到的這個項目有點死了而且不再開發(最后一次提交2年前) )。 你可以使用它作為基地,為你的工作或你如何能結合參考QML
和Qt
。
C-Glue Layer意味着,您基本上編寫了兩次代碼。 你寫一個完整的C++
來C
在包裝C++
(可直接與界面的語言Qt
和Qml
)。 這意味着你將一個類的每個方法都包裝在一個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接口,已經有一些指南:
在makind Qt
過程的最后一步, Qml
綁定將根據你新制作的C-Bindings
Binding重建D
的OOP-Api
。
SWIG
/ Binding生成器 我不是SWIG
的專家,這就是我只用幾句話覆蓋它的原因。
您可以使用SWIG
的是為您生成整個C/C++-Glue Layer thingy
。 如果你很幸運,你的SWIG-File
只包括一些includes
Qt
和SWIG
將為你完成的所有工作。 如果沒有,您必須自己定義Classes
和Functions
規則,這可能是乏味的(但也比執行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,所以這可能是一個好的開始。
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為您提供了最大的靈活性,它可以工作,但並不簡單,尤其是長期任務(我會為相當小的項目執行此操作)。 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.