2012-04-20 62 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