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

01 QObject *plugin = loader.instance;

02 if (TextArtInterface *i = qobject_cast(plugin))

03 textArtInterfaces.append(i);

04 if (BorderArtInterface *i = qobject_cast(plugin))

05 borderArtInterfaces.append(i);

06 if (TextureInterface *i = qobject_cast(plugin))

07 textureInterfaces.append(i);

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

01 void TextArtDialog::populateListWidget(const QString &text)

02 {

03 QSize iconSize = listWidget->iconSize;

04 QPen pen(QColor("darkseagreen"));

05 QLinearGradient gradient(0, 0, iconSize.width / 2,

06 iconSize.height / 2);

07 gradient.setColorAt(0.0. QColor("darkolivegreen"));

08 gradient.setColorAt(0.8, QColor("darkgreen"));

09 gradient.setColorAt(1.0, QColor("lightgreen"));

10 QFont font("Helvetica", iconSize.height, QFont::Bold);

11 foreach (TextArtInterface *interface, interfaces) {

12 foreach (QString effect, interface->effects) {

13 QListWidgetItem *item = new QListWidgetItem(

14 effect, listWidget);

15 QPixmap pixmap = interface->applyEffect(effect,

16 text, font, iconSize, pen, gradient);

17 item->setData(Qt::DecorationRole, pixmap);

18 }

19 }

20 listWidget->setCurrentRow(0);

21 }

Функция populateListWidget начинается с создания некоторых переменных, передаваемых функции applyEffect, в частности пера, линейного градиента и шрифта. Затем она просматривает в цикле все интерфейсы TextArtInterface, найденные функцией loadPlugins. Для любого эффекта, обеспечиваемого каждым интерфейсом, создается новый элемент QListWidgetItem, текст которого определяет название создаваемого им эффекта, и создается QPixmap, используя applyEffect.

В данном разделе мы увидели, как можно загружать подключаемые модули, вызывая в конструкторе функцию loadPlugins, и как можно их использовать в функции populateListWidget. Программный код элегантно обрабатывает ситуации, когда подключаемые модули вообще не обеспечивают интерфейс TextArtInterface или когда только один из них или несколько обеспечивают такой интерфейс. Более того, другие подключаемые модули могут добавляться позже. При каждом запуске приложения производится загрузка всех подключаемых модулей, имеющих нужный интерфейс. Это позволяет легко расширять функциональность приложения без изменения самого приложения.

<p>Написание подключаемых к приложению модулей</p>

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

Здесь мы рассмотрим программный код только одного из них — Basic Effects Plugin (модуль основных эффектов). Предполагаем, что исходный код подключаемого модуля находится в каталоге basiceffectsplugin и что приложение Text Art находится в параллельном каталоге textart. Ниже приводится объявление класса подключаемого модуля:

01 class BasicEffectsPlugin

02 : public QObject, public TextArtInterface

03 {

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже