Pull to refresh

Заметка о Jambi (Qt Java bindings)

Reading time6 min
Views6.2K

Предисловие


На Хабре была статья о создании Qt приложения на C++, но не было примера для Java. Я решил потратить 10 минут свободного времени и написать наипростейшее приложение. Меня интересовало:
  • Создание визуальной части
  • Использование слотов и сигналов

Под катом краткое описание того, что у меня получилось.


Суть


В начале качаем jambi qt.nokia.com/downloads, распаковываем, создаём джава проект в вашей среде разработки и создаём Main класс. Сразу приведу свой:
package jambi.demo;

import com.trolltech.qt.gui.QApplication;
import com.trolltech.qt.gui.QGridLayout;
import com.trolltech.qt.gui.QLayout;
import com.trolltech.qt.gui.QPushButton;
import com.trolltech.qt.gui.QTextEdit;
import com.trolltech.qt.gui.QWidget;

public class Main
{
    /* 
     * Класс нашего окна
     */

    public static class MainWindow
        extends QWidget
    {

        public MainWindow( )
        {
            setWindowTitle( «This is simple demo of JAmbi» );
            initControls();
        }

        // Текстовое поле, от куда будем брать текст для вывода в консоль
        private static final QTextEdit edit = new QTextEdit( «initial string» );

        private void initControls()
        {
            // Создаём контейнер для виджетов            
            QLayout layout = new QGridLayout( this );

            // Просто кнопка.
            QPushButton button = new QPushButton( «push me» );

            // Тут мы говорим Qt, что для «clicked» сигнала нужно 
            // вызвать «on_button1_clicked()» у объекта «this». 
            // Вместо this может быть любой другой объект 
            button.clicked.connect( this«on_button1_clicked()» );

            // добавляем виджеты в контейнер
            layout.addWidget( edit );
            layout.addWidget( button );
        }

        void on_button1_clicked()
        {

            System.out.println( edit.toPlainText() );

            /* Создание диалога из сгенерённого класса-билдера */

            // 1. Создаем «пустой» виджет
            QWidget dialog = new QWidget();

            // 2. Создаём инстанс билдера 
            Ui_Dialog1 dialogProto = new Ui_Dialog1();

            // 3. Инициализируем визуальную часть 
            dialogProto.setupUi( dialog );

            // 4. Делаем всё остальное (линкуем слоты и сигналы)
            dialogProto.pushButton.clicked.connect( this«on_pushButton_clicked()» );

            dialog.show();
        }

        void on_pushButton_clicked()
        {
            System.out.println( «Push button clicked» );
        }
    }

    public static void main( String[] args )
    {
        // Создаём Qt приложение, что бы инициализировать библиотеку
        // и графическую подсистему. 
        QApplication app = new QApplication( args );

        QWidget mainWidget = new MainWindow();

        mainWidget.show();

        QApplication.exec();
    }

}

Что бы инициализировать Qt создаём QApplication. Но самое интерсное как раз в MainWindow.
Первое, что мне очень понравилось, это простота назначения экшенов на сигналы. Джавовский reflection api и идея slot/signal образуют весьма удобный и просто в использовании механизм связывания.

Вторым на очереди был созданный в designer пользовательский интерфейс. Тут я встретил небольшой баг:
при попытке выполнить jambi_home/bin/juic -d ../project ../project/test.ui , я получил:
juic: not jambi file
Проблема оказалась в том, что juic ищет проперти language=«jambi» в ui ноде, но так как designer его там не прописал, проверка на валидность не проходит.

В финале я получил сгенеренный Ui_Dialog1.java, который содержал не готовый код виджета, а лишь билдер. Чтобы его использовать, достаточно создать пустой виджет и натравить на него инстанс метод setupUi(widget) класса билдера.
Все это происходит во время выполнения программы, что возможно не совсем хорошо, при создании окон с большим количеством элементов.
Все элементы интерфейса доступны как public members класса билдера, что делает решение не совсем обдуманным, потому что получается, что на каждый инстанс виджета будет инстан класса билдера.

Заключение


Jambi неплохая альтернатива swing/awt (в плане производительности, думаю, будет прирост). Лично мне она приглянулась простотой создания java gui. Но прежде чем использовать её в комерческом проекте, я бы подумал:
1. стоит ли прирост производительности стоимости лицензии
2. о возможных проблемах при распространении конечного продукта, потому что для каждой платформы нативная часть библиотеки своя.

Статья же — повод обсудить Jambi на Хабре. Очень хочется услышать коментарии людей, которые давно работают с данной библиотекой и применяют её в крупных проектах.
Tags:
Hubs:
Total votes 3: ↑1 and ↓2-1
Comments17

Articles