Home · All Classes · Main Classes · Grouped Classes · Modules · Functions

[Предыдущая: Новый Qt Designer] [Начало] [Далее: Поддержка GUI Баз Данных в Qt 4]

Поддержка Кросс-Платформенности в Qt 4

Qt 4 позволяет разрабатывать кросс-платформенные приложения, позовляющие пользователям работать с приложениями на привычной для них платформе отличной от той, на которой приложение разрабатывалось. Такой подход Qt позволяет создавать приложения доступные для большего количества пользователей и выйти на рынок правительственных заказов где доступность - частое требование.

Общий Обзор

Qt 3 всегда поддерживал Microsoft Active Accessibility (MSAA) и Mac OS X Accessibility. Qt 4 закрыл пробел в достижении кросс-платформенности Trolltech добавив поддержку для AT-SPI в Unix/X11.

Со времен Qt 3 классы мультиплатформенности были расширены различными способами. Мы добавили новые функции и новые значения перечислений, и пересмотрели API для того, чтобы сделать поддержку мультиплатформенности более совместимой с остальными частями Qt. Мы также добавили свойства accessibleName и accessibleDescription к QWidget, которые можно изменить в Qt Designer для того, чтобы хранить вспомогательный текст без необходимости писать дополнительный код.

Архитектура достижения кросс-платформенности Qt следующая: Qt предоставляет один родовой интерфейс QAccessibleInterface в который можно обернуть любые виджеты и объекты (например QPushButton). Этот единстеннвй интерфейс предоставляет все метаданные необходимые для вспомогательных технологий. Qt предоставляет поддержку этого интерфейса для своих встроенных виджетов в виде плагинов.

При создании собственных виджетов вы можете создавать свои подклассы QAccessibleInterface и распространять их как плагины (с использованием QAccessiblePlugin) или включать их в приложение. Аналогично, поддержка мультиплатформенности Qt может быть сделана как подключаемая (по умолчанию) или втроенная в библиотеку Qt. Основное преимущество использования плагинов заключается в том, что классы совместимости загружаются в память только если есть в них потребность, а в обычном случае (если никакая вспомогательная технология не используется, они не замедляют работу.

В дополнение к QAccessibleInterface Qt два класса, предназначенных для облегчения работы: QAccessibleObject и QAccessibleWidget, которые предоставляют минимальный набор общих значений метаданных (например: геометрия виджета, заголовок окна, текст краткой подсказки). Вы можете использовать их как при создании оболочек для ваших пользовательских подклассов QObject или QWidget.

Другая особенность Qt 4 - это то, что Qt способен поддерживать в дополнение к стандартным другие исключения. Это можно сделать создав подкласс QAccessibleBridge.

Примеры кода

Первый пример показывает, как предоставить информацию о совместимости для стандартного виджета. Мы можем использовать QAccessibleWidget как базовый класс и переопределить реализацию различных функций:

    class MyWidgetInterface : public QAccessibleWidget
    {
    public:
        MyWidgetInterface(QWidget *widget, Role role);

        QString text(Text text, int child) const;
        State state(int child) const;
        QString actionText(int action, Text text, int child) const;
        bool doAction(int action, int child, const QVariantList &params);
        ...
    };

Здесь показано, как можено реализовать функцию doAction() для вызова функции именуемой click() для оборачиваемого объета MyWidget когда пользователь вызывает для объекта дейсвие по умолчанию или "нажимает" его.

    bool MyWidgetInterface::doAction(int action, int child,
                                     const QVariantList &params)
    {
        if (child || !widget()->isEnabled())
            return false;

        switch (action) {
        case DefaultAction:
        case Press:
            {
                MyWidget *widget = qobject_cast<MyWidget *>(object());
                if (widget)
                    widget->click();
            }
            return true;
        }
        return QAccessibleWidget::doAction(action, child, params);
    }

Для того чтобы реализовать виджет как плагин, создать наследовать класс QAccessibleFactory:

    QStringList MyFactory::keys() const
    {
        return QStringList() << "MyWidget" << "MyOtherWidget";
    }

    QAccessibleInterface *MyFactory::create(const QString &className,
                                            QObject *object)
    {
        if (classname == "MyWidget")
            return new MyWidgetInterface(object);
        if (classname == "MyOtherWidget")
            return new MyOtherWidgetInterface(object);
        return 0;
    }

    Q_EXPORT_PLUGIN(MyFactory)

[Предыдущая: Новый Qt Designer] [Начало] [Далее: Поддержка GUI Баз Данных в Qt 4]


Copyright © 2005 Trolltech Trademarks
Qt 4.1.0
Hosted by uCoz