Подключаемый к приложению модуль является подклассом 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().

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);

Перейти на страницу:

Похожие книги