Использование расширений (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.
Читать далее: Поддержка собственных расширений в приложениях