Написание подключаемых к приложению модулей
Написание подключаемых к приложению модулей
Подключаемый к приложению модуль является подклассом QObject и интерфейсов, которые он собирается обеспечить. Прилагаемый к этой книге компакт-диск содержит два подключаемых модуля, предназначенных для приложения Text Art, представленного в предыдущем разделе, и показывающих, что это приложение правильно работает с несколькими подключаемыми модулями.
Здесь мы рассмотрим программный код только одного из них — Basic Effects Plugin (модуль основных эффектов). Предполагаем, что исходный код подключаемого модуля находится в каталоге basiceffectsplugin и что приложение Text Art находится в параллельном каталоге textart. Ниже приводится объявление класса подключаемого модуля:
01 class BasicEffectsPlugin
02 : public QObject, public TextArtInterface
03 {
04 Q_OBJECT
05 Q_INTERFACES(TextArtInterface)
06 public:
07 QStringList effects() const;
08 QPixmap applyEffect(const QString &effect, const QString &text,
09 const QFont &font, const QSize &size,
10 const QPen &pen, const QBrush &brush);
11 };
Этот подключаемый модуль реализует только один интерфейс — TextArtInterface. Кроме Q_OBJECT необходимо использовать макрос Q_INTERFACES() для каждого интерфейса, для которого создается подкласс, чтобы обеспечить безболезненное восприятие компилятором moc оператора приведения типа qobject_cast<T>().
01 QStringList BasicEffectsPlugin::effects() const
02 {
03 return QStringList() << "Plain" << "Outline" << "Shadow";
04 }
Функция effects() возвращает список текстовых эффектов, поддерживаемых подключаемым модулем. Этот подключаемый модуль обеспечивает три эффекта, поэтому возвращаем список, содержащий имена каждого из них.
Функция applyEffect() обеспечивает функциональность подключаемого модуля и слегка запутанна, поэтому рассмотрим ее по частям:
01 QPixmap BasicEffectsPlugin::applyEffect(const QString &effect,
02 const QString &text, const QFont &font, const QSize &size,
03 const QPen &pen, const QBrush &brush)
04 {
05 QFont myFont = font;
06 QFontMetrics metrics(myFont);
07 while ((metrics.width(text) > size.width() ||
08 metrics.height() > size.height())
09 && myFont.pointSize() > 9) {
10 myFont.setPointSize(myFont.pointSize() - 1);
11 metrics = QFontMetrics(myFont);
12 }
Мы хотим обеспечить по мере возможности достаточность указанного размера для размещения заданного текста. По этой причине используем метрики шрифта и, если текст оказывается слишком большим, входим в цикл, где уменьшаем размер, пока он не окажется подходящим или не достигнет 9 точек, что соответствует нашему минимальному размеру.
13 QPixmap pixmap(size);
14 QPainter painter(&pixmap);
15 painter.setFont(myFont);
16 painter.setPen(pen);
17 painter.setBrush(brush);
18 painter.setRenderHint(QPainter::Antialiasing, true);
19 painter.setRenderHint(QPainter::TextAntialiasing, true);
20 painter.setRenderHint(QPainter::SmoothPixmapTransform, true);
21 painter.eraseRect(pixmap.rect());
Мы создаем пиксельную карту требуемого размера и рисовальщик для рисования на пиксельной карте. Также устанавливаем некоторые особенности воспроизведения, чтобы обеспечить максимальное сглаживание при выводе текста. Вызов функции eraseRect() очищает пиксельную карту, заполняя ее цветом фона.
22 if (effect == "Plain") {
23 painter.setPen(Qt::NoPen);
24 } else if (effect == "Outline") {
25 QPen pen(Qt::black);
26 pen.setWidthF(2.5);
27 painter.setPen(pen);
28 } else if (effect == "Shadow") {
29 QPainterPath path;
30 painter.setBrush(Qt::darkGray);
31 path.addText(((size.width() - metrics.width(text)) / 2) + 3,
32 (size.height() - metrics.descent()) + 3, myFont, text);
33 painter.drawPath(path);
34 painter.setBrush(brush);
35 }
Для эффекта «Plain» (простой) не требуется никакой рамки. Для эффекта «Outline» (рамка) игнорируем исходное перо и создаем наше собственное перо шириной в 2.5 пикселя. Для эффекта «Shadow» (тень) сначала рисуется тень, чтобы можно было выводить текст поверх нее.
36 QPainterPath path;
37 path.addText((size.width() - metrics.width(text)) / 2,
38 size.height() - metrics.descent(), myFont, text);
39 painter.drawPath(path);
40 return pixmap;
41 }
Теперь у нас имеются перо и кисти, соответствующим образом установленные для каждого текстового эффекта, а для эффекта «Shadow» нарисована тень. После этого мы готовы воспроизвести текст. Текст центрируется по горизонтали и выводится достаточно далеко от нижнего края пиксельной карты, чтобы оставить достаточно места для размещения нижних выносных элементов.
Q_EXPORT_PLUGIN2(basiceffectsplugin, BasicEffectsPlugin)
В конце файла .cpp используем макрос Q_EXPORT_PLUGIN2(), чтобы этот подключаемый элемент был доступен для Qt.
Файл .pro аналогичен файлу, который мы использовали ранее в данной главе для подключаемого модуля курсоров Windows:
TEMPLATE = lib
CONFIG += plugin
HEADERS = ../textart/textartinterface.h
basiceffectsplugin.h
SOURCES = basiceffectsplugin.cpp
DESTDIR =../textart/plugins
Если данная глава повысила ваш интерес к подключаемым к приложению модулям, вы можете изучить имеющийся в Qt более сложный пример Plug & Paint (подключи и рисуй). Приложение поддерживает три различных интерфейса и включает в себя полезное диалоговое окно Plugin Information (информация о подключаемых модулях), которое содержит списки подключаемых модулей и интерфейсов, доступных в приложении.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
4 Написание кода
4 Написание кода В предыдущей книге[13] я подробно описал структуру и природу Чистого Кода. В этой главе будет рассмотрен сам акт написания кода, а также контекст, в котором он происходит.Когда мне было 18 лет, я набирал текст достаточно быстро, но мне приходилось смотреть на
22.5. Добавление надежности приложению UDP
22.5. Добавление надежности приложению UDP Если мы хотим использовать UDP для приложения типа «запрос-ответ», как было отмечено в предыдущем разделе, мы должны добавить нашему клиенту две функции:? тайм-аут и повторную передачу, которые позволяют решать проблемы, возникающие
17.5.6. Компиляция модулей
17.5.6. Компиляция модулей Если вы сконфигурировали какие-то драйверы как отдельные модули (выбирали при конфигурации вариант "m" при ответе на некоторые вопросы), то вы теперь должны еще выполнить команду make modules, а затем еще команду make modules_install. В файле Documentation/modules.txt можно
Приложение 2 100 SEO-модулей
Приложение 2 100 SEO-модулей 1. Модуль сбора позиций.2. Модуль генерации ЧПУ.3. Модуль генерации Description.4. Модуль генерации Title.5. Модуль генерации H1.6. Ловец ботов.7. Модуль перелинковки для улучшения анкорного ранжирования.8. Модуль перелинковки для индексации новых страниц.9.
Как разрешить приложению работать через брандмауэр Windows
Как разрешить приложению работать через брандмауэр Windows Брандмауэр Windows 7 по умолчанию блокирует работу большинства установленных на компьютере приложений. Собственно, во многом благодаря именно этому и достигается высокий уровень безопасности компьютера: если
Глава 19. Создание подключаемых модулей
Глава 19. Создание подключаемых модулей Динамические библиотеки (называемые также совместно используемыми библиотеками или библиотеками DLL) — это независимые модули, хранимые в отдельном файле на диске, доступ к которым могут получать несколько приложений. Как правило,
Расширение Qt с помощью подключаемых модулей
Расширение Qt с помощью подключаемых модулей Qt можно расширять, используя различные типы подключаемых модулей, среди которых наиболее распространенными являются драйверы баз данных, форматы изображений, стили и текстовые кодировки. Каждый тип подключаемых модулей
Планирование модулей
Планирование модулей Нельзя сказать, что проблема организации модулей слишком сложна. Имеет смысл подумать только над тем, сколько модулей следует создать и какие процедуры должны в них войти. Вот те моменты, о которых нужно при этом помнить.Процедуры могут вызывать или
Тестирование модулей
Тестирование модулей Тестирование модулей (unit testing) представляет собой процесс тестирования отдельных частей независимо от самой программы.Одним из новых методов разработки программного обеспечения, который появился уже при написании этой книги, является
Разработка модулей
Разработка модулей Разработка модулей PSQL является жизненно важной частью деятельности, как разработчика, так и администратора базы данных. Поскольку запросы администратора Firebird ясны, обычно на практике эти две роли объединяются. В процессе разработки обычно довольно
Путь к запущенному приложению
Путь к запущенному приложению Иногда требуется узнать путь к файлу запущенного приложения. Для этого можно воспользоваться кодом из листинга 14.3.Листинг 14.3using System.IO;using System.Reflection;txtAppDir.Text = Path.GetDirectoryName(Assembly.GetExecutingAssemblу().GetModule()[0]. FullyQuelifiedName).ToString();В этом примере после выбора
1.1. Привлечение внимания к приложению
1.1. Привлечение внимания к приложению Начнем с простых примеров, позволяющих привлечь внимание пользователя к определенному окну приложения. Это может пригодиться в различных ситуациях: от уведомления пользователя об ошибке программы до простой сигнализации ему, какое
Написание букв
Написание букв Окно программы содержит две вкладки: «Написание букв» и «Графологический анализ».Щелкнув на вкладке «Написание букв», вы попадаете в раздел для определения сильных и слабых качественных черт характера по форме написания букв (рис. 199). Рис. 199Слева
Написание сценария
Написание сценария Итак, с панелью Actions мы вкратце познакомились. Конечно, полностью ее возможности (кстати, весьма широкие) мы не рассмотрели, но сейчас нам важнее написать наш первый сценарий, чем выяснять, чем богата эта панель. Позже мы займемся ей более подробно.Выше