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.

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 }

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