Подключаемый к приложению модуль является подклассом
Здесь мы рассмотрим программный код только одного из них — Basic Effects Plugin (модуль основных эффектов). Предполагаем, что исходный код подключаемого модуля находится в каталоге
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 };
Этот подключаемый модуль реализует только один интерфейс —
01 QStringList BasicEffectsPlugin::effects() const
02 {
03 return QStringList() << "Plain" << "Outline" << "Shadow";
04 }
Функция
Функция
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());
Мы создаем пиксельную карту требуемого размера и рисовальщик для рисования на пиксельной карте. Также устанавливаем некоторые особенности воспроизведения, чтобы обеспечить максимальное сглаживание при выводе текста. Вызов функции
22 if (effect == "Plain") {
23 painter.setPen(Qt::NoPen);
24 } else if (effect == "Outline") {
25 QPen pen(Qt::black);