7

我发现关于这个主题的文档为零(我是否在错误的地方搜索?这对我来说似乎很奇怪)。

我只需要能够为我的 Vala 应用程序使用 Qt GUI。一个例子将不胜感激。

4

2 回答 2

15

正如其他人所提到的,Qt 和 Vala 不能携手合作,但这并不意味着不可能让他们合作。它主要是关于了解幕后发生的事情。

Vala 生成 C 代码,然后将其馈送到 gcc(或其他已安装的编译器)以生成二进制文件。请注意,Vala 设计师的主要目标之一是让 Vala 生成基于 C 的库。然后这些可以被其他接受基于 C 的绑定的语言使用——Python、Ruby、Java 等等。

因此,您可以使用 Vala 编写 Qt C++ GUI 应用程序调用的基于 C 的库。Vala 编译器生成一个 .h 文件,您的 Qt 应用程序仅 #includes。

问题在于 Qt 和 Vala 使用不同的对象系统:QObject 用于 Qt,GObject 用于 Vala。(Vala 确实允许其他后端,甚至有人认为 Vala 会生产 Qt C++ 而不是基于 GObject 的 C,但这还遥遥无期。) QObject 和 GObject 不兼容,因此您的 QObjects 可以与 GObjects 对话,你需要做很多基于 C 的手动工作。(用 C 语言编写 GObject 非常冗长,因此 Vala 的魅力在于隐藏所有这些。)

但这是可以完成的。请注意,Qt 甚至会使用 GLib 的事件循环而不是它自己的,从而允许代码混合在事件驱动的应用程序中。

我不能衷心推荐上面的,但理论上是可以的,主要是因为 C++ 代码可以很容易地调用 C 代码。

另一个值得考虑的可能性是让 Vala 代码成为 DBus 服务器,而您的 Qt 代码成为 DBus 客户端。DBus 是一个花哨的 IPC,因此它并不适合所有应用程序,但它可能适合您的应用程序。这很有吸引力,因为 Vala 可以轻松地生成 DBus 客户端和服务器(它们看起来像普通对象)。也可以使用生成 Qt DBus 绑定的工具。请注意,这意味着您的 Vala 代码作为单独的进程运行,而不是进程内库。请参阅http://live.gnome.org/Vala/DBusServerSamplehttp://live.gnome.org/Vala/DBusClientSamples

于 2012-04-25T23:58:06.693 回答
0

这不是您想要的,但请查看https://live.gnome.org/GObjectIntrospection/GObjectConsume 这将 gobject-introspection 引入 C++。使用 GObjectConsume,您可以在 C++ 和 qt 中使用您的 vala 库。

于 2012-08-09T10:44:17.480 回答