2012-04-20 66 views
6

我找到了有關此主題的文檔(我是否在錯誤的地方搜索?對我來說這似乎很奇怪)。如何在Vala中使用Qt GUI?

我只需要能夠爲我的Vala應用程序使用Qt GUI。一個例子,將不勝感激。

+0

我不認爲有任何Vala綁定Qt。 – Mat 2012-04-20 07:24:03

+0

我不認爲,也不太明白這種事情的動機。從某種意義上說,Qt就是C++的C++(或者更具體地說就是Gnome C API)。通常情況下,人們只會依賴他們更舒適的方式。 – teukkam 2012-04-20 07:26:56

+0

所以沒辦法做到這一點? – RobinJ 2012-04-20 08:21:27

回答

13

正如其他人所提到的,Qt和Vala不能攜手合作,但這並不意味着不可能讓他們合作。主要是瞭解封面下面發生了什麼。

Vala生成C代碼,然後將其提供給gcc(或其他安裝的編譯器)以生成二進制文件。請注意,Vala設計師的主要目標之一是讓Vala生產基於C的庫。這些可以被接受基於C的綁定的其他語言使用 - Python,Ruby,Java等等。

因此,您可以使用Vala編寫一個基於C的庫,以便您的Qt C++ GUI應用程序調用。 Vala編譯器生成一個.h文件,說明你的Qt應用程序只包含#。

這個問題在於Qt和Vala使用不同的對象系統:用於Qt的QObject,用於Vala的GObject。 (Vala確實允許其他後端,甚至有人認爲Vala生成的是Qt C++而不是基於GObject的C,但這在將來還是遙不可及的。)QObject和GObject不兼容,所以爲了讓QObject與GObjects交談,你需要做許多基於C的手工工作。 (用C編寫GObject非常冗長,因此Vala的魅力隱藏了它的全部)。

但是可以這樣做。請注意,Qt will even use GLib's event loop rather than its own,允許代碼在事件驅動的應用程序中混用。

我不能衷心推薦上述內容,但從理論上說這是可能的,主要是因爲C++代碼可以輕鬆地調用C代碼。

另一個值得考慮的可能是讓Vala代碼成爲DBus服務器,而您的Qt代碼成爲DBus客戶端。 DBus是一個花哨的IPC,所以這不適用於所有應用程序,但它可能適用於您的應用程序。這很吸引人,因爲Vala可以輕鬆生成DBus客戶端和服務器(它們看起來像普通對象)。生成Qt DBus綁定的工具也可以使用。請注意,這意味着您的Vala代碼作爲單獨的進程運行,而不是進程內庫。見http://live.gnome.org/Vala/DBusServerSamplehttp://live.gnome.org/Vala/DBusClientSamples