Использование расширений (plug-ins) в Qt


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

  • расширения для Qt;
  • расширения для собственных приложений.

Расширение для Qt

Qt предоставляет различные типы расширений, предназначенные для дополнения возможностей библиотеки. Например, поддержка новых форматов растровых файлов, новых драйверов баз данных. Их более 20 и вот некоторые из них:

  • QSqlDriverPlugin — для драйверов баз данных;
  • QPictureFormatPlugin, QImageIOPlugin — для поддержки различных форматов растровых изображений;
  • QTextCodecPlugin — для реализации кодировок текста;
  • QStylePlugin — для стилей элементов управления.

Все эти классы наследуют класс QObject, который является базовым для всей системы расширений Qt. Свои расширения для Qt нужно строить на базе этих классов, реализовывая в них нужные методы. Возьмем для примера класс QStylePlugin. Реализация расширения с применением этого класса, CustomStyle, могла бы выглядеть так, как это показано в листингах.


class CustomStylePlugin : public QStylePlugin 
{ 
public: 
QStringList keys ( ) const; 
QStyle* create(const QString &key); 
};

В классе, унаследованном от QStylePlugin, необходимо реализовать виртуальные методы keys() и create().


QStringList CustomStylePlugin::keys() const 
{ 
    return QStringList() << "CustomStyle"; 
}

Метод keys() возвращает список строк, реализованных в классе расширений, в нашем примере оно одно — "CustomStyle"


QStyle* CustomStylePlugin::create(const QString &key) 
{
  if (key == "CustomStyle") 
    return new CustomStyle; 
  return 0; 
}

Метод create() создает запрашиваемый объект и возвращает указатель на него. В том случае, если запрашиваемый объект не найден, метод вернет нулевое значение. Экспортирование класса расширений производится в конце срр-файла при помощи макроса Q_EXPORT_PLUGIN2 следующим образом:

Q_EXPORT_PLUGIN2(CustomStylePlugin)


void main(int argc, char** argv) 
{ 
  QApplication::setStyle(QStyleFactory::create("CustomStyle"));
}

Созданный класс расширений должен быть скомпилирован в динамическую библиотеку. Его загрузку можно произвести при помощи класса QStyleFactory.

Для того чтобы Qt мог воспользоваться нашим расширением, его необходимо разместить в директории расширений соответствующего типа, расположенном в каталоге библиотеки. В нашем случае это будет директория <Директория Qt>/plugins/styles.

Читать далее: Поддержка собственных расширений в приложениях