如何在Vala中使用Qt GUI?

7

我在这个问题上找不到任何文档(是我找错地方了吗?这对我来说很奇怪)。

我只需要能够为我的Vala应用程序使用Qt GUI。如果有示例就更好了。


我认为没有任何适用于Qt的Vala绑定。 - Mat
我不认为这种做法有什么动机。从某种意义上讲,Qt 对于 C++ 就像 Vala 对于 C(或更具体地说,是 Gnome C API)。通常人们会根据自己的熟悉程度选择其中之一。 - teukkam
没有绝对的办不到,但它需要额外的工作量,你可能会浪费时间。也许你能说一下为什么需要同时使用Qt和Vala,这样有人就可以建议替代方案了? - ptomato
@ptomato 主要是因为我想学习 Vala,而且 Qt 设计师比 Glade 设计师更容易使用。 - RobinJ
我会选择Qt或Vala中的一个,而不是同时学习两者。Vala的对象系统与C ++的对象系统非常不同,我不预见任何人会认为编写代码将两者合并是值得的。 - ptomato
2个回答

15

正如其他人所提到的,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/DBusServerSamplehttp://live.gnome.org/Vala/DBusClientSamples

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接