2012-04-20 3 views
6

Я нашел ноль документация на эту тему (Я искал не в том месте? Мне кажется странным).Как использовать Qt GUI с Vala?

Мне просто нужно использовать Qt GUI для моего приложения Vala. Примером может служить оценка.

+0

Я не думаю, что есть какие-либо привязки Валы для Qt. – Mat

+0

Я тоже не думаю, что не вижу мотивации для такого рода вещей. В некотором роде Qt является C++, что Vala для C (или более конкретно, API Gnome C). Обычно люди просто идут либо в зависимости от того, с чем им удобнее. – teukkam

+0

Так что нет способа это сделать? – RobinJ

ответ

13

Как уже упоминалось, Qt и Vala не работают рука об руку, но это не значит, что невозможно заставить их сотрудничать. В основном это понимание того, что происходит под обложками.

Vala генерирует код C, который затем подается в gcc (или другой установленный компилятор) для создания двоичного файла. Обратите внимание: одна из главных целей дизайнеров Вала заключалась в том, чтобы Вала создавала библиотеки на основе C. Затем они могут использоваться другими языками, которые принимают привязки на основе C - Python, Ruby, Java и т. Д.

Итак, вы можете использовать Vala для кодирования библиотеки на основе C, к которой обращается ваше приложение Qt C++ GUI. Компилятор Vala создает файл .h, в котором ваше приложение Qt просто # включает.

Проблема в том, что Qt и Vala используют разные объектные системы: QObject для Qt, GObject для Vala. (Вала допускает другие бэкэнды, и есть даже некоторые мысли о том, что Вала выпускает Qt C++ вместо GObject-based C, но это далеко в будущем.) QObject и GObject несовместимы, и поэтому для QObjects говорить с GObjects, вам нужно сделать много ручной работы на основе C. (Написание GObject в C довольно многословно, поэтому привлекательность 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