Альтернативный подход заключается в динамической загрузке библиотеки по мере необходимости и затем разрешении ее символов, которые будут нами использоваться. Qt предоставляет класс QLibrary для решения этой задачи независимым от платформы способом. Получая основную часть имени библиотеки, QLibrary выполняет поиск соответствующего файла в стандартном для платформы месте. Например, если задано имя mimetype, будет выполняться поиск файла mimetype.dll в Windows, mimetype.so в Linux и mimetype.dylib в Mac OS X.

Часто можно расширять функциональные возможности современных приложений с графическим пользовательским интерфейсом за счет применения подключаемых модулей. Подключаемый модуль (plugin) — это динамическая библиотека, которая реализует специальный интерфейс для обеспечения дополнительной функциональности. Например, в главе 5 мы создали подключаемый модуль для интеграции пользовательского виджета в Qt Designer.

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

Кроме того, можно создавать подключаемые модули, предназначенные для конкретных Qt—приложений. Писать такие подключаемые модули в Qt достаточно просто с использованием фреймворка Qt для подключаемых модулей, который повышает безопасность и удобство применения класса QLibrary. В последних двух разделах данной главы мы покажем, как обеспечить в приложении поддержку подключаемых модулей и как создавать пользовательские подключаемые модули для приложения.

<p>Расширение Qt с помощью подключаемых модулей</p>

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

Ниже приведен список Qt—классов подключаемых модулей и обработчиков, исключая Qtopia Core (рис. 19.1):

• QAccessibleBridgePlugin — QAccessibleBridge,

• QAccessiblePlugin — QAccessibleIntertace,

• QIconEnginePlugin — QIconEngine,

• QImageIOPlugin — QImageIOHandler,

• QInputContextPlugin — QInputContext,

• QPictureFormatPlugin — нет обработчика,

• QSqlDriverPlugin — QSqlDriver,

• QStylePlugin — QStyle,

• QTextCodecPlugin — QTextCodec.

В демонстрационных целях мы реализуем подключаемый модуль, способный считывать в Windows монохромные файлы курсоров (файлы .cur). Эти файлы могут содержать несколько изображений разного размера для одного курсора. После построения и установки этого подключаемого модуля Qt сможет считывать файлы .cur и получать доступ к отдельным курсорам (например, с помощью классов QImage, QImageReader или QMovie); также можно будет преобразовывать эти курсоры в любой другой формат файлов изображений, воспринимаемый Qt (например, BMP, JPEG и PNG). Кроме того, подключаемый модуль может разворачиваться совместно с Qt—приложениями, поскольку они автоматически проверяют стандартные места расположения подключаемых модулей Qt и загружают все найденные модули.

Новые классы—оболочки подключаемых модулей должны быть подклассом QImageIOPlugin и должны обеспечить реализацию нескольких виртуальных функций:

01 class CursorPlugin : public QImageIOPlugin

02 {

03 public:

04 QStringList keys() const;

05 Capabilities capabilities(QIODevice *device,

06 const QByteArray &format) const;

07 QImageIOHandler *create(QIODevice *device,

08 const QByteArray &format) const;

09 };

Функция keys() возвращает список форматов изображений, которые поддерживает подключаемый модуль. Можно считать, что параметр format функций capabilities() и create() имеет значение из этого списка.

01 QStringList CursorPlugin::keys() const

02 {

03 return QStringList() << "cur";

04 }

Перейти на страницу:

Похожие книги