Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

Саммерфилд Марк

Шрифт:

01 void TextArtDialog::loadPlugins

02 {

03 QDir pluginDir(QApplication::applicationDirPath);

04 #if defined(Q_OS_WIN)

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

06 || pluginDir.dirName.toLower == "release")

07 pluginDir.cdUp;

08 #elif defined(Q_OS_MAC)

09 if (pluginDir.dirName == "MacOS") {

10 pluginDir.cdUp;

11 pluginDir.cdUp;

12 pluginDir.cdUp;

13 }

14 #endif

15 if (!pluginDir.cd("plugins"))

16 return;

17 foreach (QString fileName, pluginDir.entryList(QDir::Files)) {

18 QPluginLoader loader(pluginDir.absoluteFilePath(fileName));

19 if (TextArtInterface *interface =

20 qobject_cast<TextArtInterface *>(loader.instance))

21 interfaces.append(interface);

22 }

23 }

В

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

Если файл, который мы пытаемся загрузить, является подключаемым модулем Qt и имеет ту же саму версию Qt, какую имеет приложение, функция QPluginLoader::instance возвратит указатель QObject *, ссылающийся на подключаемый модуль Qt. Используем qobject_cast<T> для проверки реализации в подключаемом модуле интерфейса TextArtInterface. При всяком успешном приведении типа мы добавляем интерфейс к списку интерфейсов приложения TextArtDialog (который имеет тип QList<TextArtInterface *>).

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

01 QObject *plugin = loader.instance;

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

03 textArtInterfaces.append(i);

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

05 borderArtInterfaces.append(i);

06 if (TextureInterface *i = qobject_cast<TextureInterface *>(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 или когда только один из них или несколько обеспечивают такой интерфейс. Более того, другие подключаемые модули могут добавляться позже. При каждом запуске приложения производится загрузка всех подключаемых модулей, имеющих нужный интерфейс. Это позволяет легко расширять функциональность приложения без изменения самого приложения.

Поделиться:
Популярные книги

Сын Тишайшего

Яманов Александр
1. Царь Федя
Фантастика:
попаданцы
альтернативная история
фэнтези
5.20
рейтинг книги
Сын Тишайшего

"Искажающие реальность" Компиляция. Книги 1-14

Атаманов Михаил Александрович
Искажающие реальность
Фантастика:
боевая фантастика
космическая фантастика
киберпанк
рпг
5.00
рейтинг книги
Искажающие реальность Компиляция. Книги 1-14

Школа. Первый пояс

Игнатов Михаил Павлович
2. Путь
Фантастика:
фэнтези
7.67
рейтинг книги
Школа. Первый пояс

Невеста на откуп

Белецкая Наталья
2. Невеста на откуп
Фантастика:
фэнтези
5.83
рейтинг книги
Невеста на откуп

Убивать чтобы жить 2

Бор Жорж
2. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 2

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

Аргумент барона Бронина 4

Ковальчук Олег Валентинович
4. Аргумент барона Бронина
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Аргумент барона Бронина 4

Измена. (Не)любимая жена олигарха

Лаванда Марго
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. (Не)любимая жена олигарха

Измена. Право на обман

Арская Арина
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на обман

Бастард Императора. Том 7

Орлов Андрей Юрьевич
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 7

Жаба с кошельком

Донцова Дарья
19. Любительница частного сыска Даша Васильева
Детективы:
иронические детективы
8.26
рейтинг книги
Жаба с кошельком

Бастард Императора. Том 11

Орлов Андрей Юрьевич
11. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 11

Академия чаросвет. Тень

Ярошинская Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Академия чаросвет. Тень

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4