четыре компо­нента: инвертированное имя домена, определяющее создателя интерфейса, имя при­ложения, имя интерфейса и номер версии. При любом изменении интерфейса (на­пример, при добавлении новой виртуальной функции или при изменении сигнатуры существующей функции) мы должны не забыть увеличить номер версии; в против­ном случае приложение может завершиться аварийно при попытке получения досту­па к старой версии подключаемого модуля.

Это приложение реализуется в виде класса TextArtDialog. Мы будем показывать только тот программный код, который связан с применением подключаемых моду­лей. Давайте начнем с конструктора:

TextArtDialog::TextArtDialog(const QString &text, QWidget *parent) : QDialog(parent)

{

listWidget = new QListWidget; listWidget->setViewMode(QListWidget::IconMode); listWidget->setMovement(QListWidget::Static); listWidget->setIconSize(QSize(260, 80));

loadPluginsO; populateListWidget(text);

}

Конструктор создает виджет QListWidget, содержащий список доступных эф­фектов. Он вызывает закрытую функцию loadPluginsO для поиска и загрузки всех подключаемых модулей, реализующих интерфейс TextArtlnterface, и заполняет список виджетов с помощью вызова другой закрытой функции - populateListWid-get().

void TextArtDialog:: loadPluginsO {

QDir pluginDir(QApplication::applicationDirPath());

#if defined(Q_0S_WIN)

if (pluginDir.dirName().toLower() == "debug"

|| pluginDir.dirName().toLower() == "release") pluginDir.cdUpO; #elif defined(Q_0S_MAC)

if (pluginDir.dirName() == "MacOS") { pluginDir. cdLlpO; pluginDir.cdUpO; pluginDir.cdUpO;

}

#endif

if (!pluginDir.cd("plugins")) return;

foreach (QString fileName, pluginDir.entryList(QDir::Files)) { QPluginLoader loader(pluginDir.absoluteFilePath(fileName)); if (TextArtlnterface *interface =

qobject_cast<TextArtInterface *>(loader.instance())) interfaces.append(interface);

}

}

В функции loadPluginsO мы пытаемся загрузить все файлы, находящиеся в ка­талоге приложения plugins. (В Windows исполняемый модуль приложения обычно находится в подкаталоге debug или release, поэтому поднимаемся на один каталог выше. В Mac OS X учитываем структуру группового каталога (bundle directory).)

Если файл, который


<< назад вперед >>