我在这个问题上找不到任何文档(是我找错地方了吗?这对我来说很奇怪)。
我只需要能够为我的Vala应用程序使用Qt GUI。如果有示例就更好了。
我在这个问题上找不到任何文档(是我找错地方了吗?这对我来说很奇怪)。
我只需要能够为我的Vala应用程序使用Qt GUI。如果有示例就更好了。
正如其他人所提到的,Qt和Vala并不能完美地配合,但这并不意味着它们不能合作。这主要是因为需要了解底层的情况。
Vala生成C代码,然后将其提供给gcc(或其他安装的编译器)来生成二进制文件。请注意,Vala设计师的主要目标之一是使Vala生成基于C的库。然后,可以使用支持C绑定的其他语言(如Python、Ruby、Java等)来使用这些库。
因此,您可以使用Vala编写一个基于C的库,供Qt C++ GUI应用程序调用。 Vala编译器会生成一个.h文件,您的Qt应用程序只需#include即可。
问题在于,Qt和Vala使用不同的对象系统:Qt使用QObject,而Vala使用GObject。 (Vala确实允许其他后端,并且甚至有一些想法让Vala生成基于Qt C++而不是基于GObject的C代码,但这还很遥远。)QObject和GObject不兼容,因此要让QObjects与GObjects交互,需要进行大量手动的基于C的工作。(使用C编写GObject非常冗长,因此使用Vala隐藏所有这些内容非常诱人。)
但是,这是可行的。请注意,Qt甚至会使用GLib的事件循环而不是自己的事件循环,从而允许在事件驱动的应用程序中组合代码。
我不能强烈推荐上述方法,但理论上它是可能的,主要是因为C++代码可以轻松调用C代码。
另一个值得考虑的可能性是将Vala代码作为DBus服务器,将Qt代码作为DBus客户端。DBus是一种高级进程间通信技术,因此并非适用于所有应用程序,但它可能适用于你的应用程序。这个方法很有吸引力,因为Vala可以很容易地生成DBus客户端和服务器(它们看起来像普通对象)。同时,也有工具可用来生成Qt的DBus绑定。需要注意的是,这意味着你的Vala代码作为一个独立的进程运行,而不是作为一个内部库运行。请参见http://live.gnome.org/Vala/DBusServerSample和http://live.gnome.org/Vala/DBusClientSamples。这可能不是你想要的,但是看一下https://wiki.gnome.org/Projects/GObjectIntrospection/GObjectConsume。它将gobject-introspection引入了C++。使用GObjectConsume,你可以在C++和Qt中使用你的Vala库。