如何在 Vala 中使用 Qt GUI?

Posted

技术标签:

【中文标题】如何在 Vala 中使用 Qt GUI?【英文标题】:How to use a Qt GUI with Vala? 【发布时间】:2012-05-01 18:39:58 【问题描述】:

我找到了关于这个主题的个文档(我是否在错误的地方搜索过?这对我来说似乎很奇怪)。

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

【问题讨论】:

我认为 Qt 没有任何 Vala 绑定。 我也不这么认为,也不太明白这种事情的动机。在某种程度上,Qt 之于 C++ 就像 Vala 之于 C(或者更具体地说,Gnome C API)。通常人们会选择哪一种,这取决于他们更喜欢什么。 没有no 方法,但它会涉及很多额外的工作,你可能会浪费你的时间。也许您可以说为什么您需要同时使用 Qt 和 Vala,然后有人可以提出替代解决方案? @ptomato 主要是因为我想学习 Vala 并且因为 Qt Designer 比 Glade Designer 更容易工作。 我会选择 Qt 或 Vala,而不是尝试同时学习两者。 Vala 的对象系统与 C++ 的对象系统完全不同,我不认为有人会认为编写代码将两者结合起来是值得的。 【参考方案1】:

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

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

因此,您可以使用 Vala 编写一个基于 C 的库,您的 Qt C++ GUI 应用程序将调用该库。 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 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/DBusServerSample和http://live.gnome.org/Vala/DBusClientSamples

【讨论】:

【参考方案2】:

这不是你想要的,但是看看https://live.gnome.org/GObjectIntrospection/GObjectConsume 这为 C++ 带来了 gobject-introspection。使用 GObjectConsume,您可以在 C++ 和 qt 中使用您的 vala 库。

【讨论】:

以上是关于如何在 Vala 中使用 Qt GUI?的主要内容,如果未能解决你的问题,请参考以下文章

Vala GUI 和 C++ 中的逻辑

如何在标准GUI应用程序中使用Qt3D进行渲染?

如何在 linux 中编写和加载 GUI? [关闭]

使用 Qt 开发音频信号处理 GUI,如何?

关闭 QT GUI 后如何停止线程

如何在linux中增加QT Gui线程优先级[重复]