Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QT 4: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ GUI Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 103

Автор Жасмин Π‘Π»Π°Π½ΡˆΠ΅Ρ‚

Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ макрос Q_DECLARE_INTERFACE() для назначСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° интСрфСйсу. Π­Ρ‚ΠΎΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°: ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ имя Π΄ΠΎΠΌΠ΅Π½Π°, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅Π΅ создатСля интСрфСйса, имя прилоТСния, имя интСрфСйса ΠΈ Π½ΠΎΠΌΠ΅Ρ€ вСрсии. ΠŸΡ€ΠΈ любом ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ интСрфСйса (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠΉ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ сигнатуры ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ) ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π΅ Π·Π°Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ вСрсии; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ получСния доступа ΠΊ старой вСрсии ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠ³ΠΎ модуля.

Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ рСализуСтся Π² Π²ΠΈΠ΄Π΅ класса TextArtDialog. ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ связан с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Ρ‡Π½Π΅ΠΌ с конструктора:

01 TextArtDialog::TextArtDialog(const QString &text, QWidget *parent)

02 : QDialog(parent)

03 {

04 listWidget = new QListWidget;

05 listWidget->setViewMode(QListWidget::IconMode);

06 listWidget->setMovement(QListWidget::Static);

07 listWidget->setIconSize(QSize(260, 80));

08 …

09 loadPlugins();

10 populateListWidget(text);

11 …

12 }

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ создаСт Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ QListWidget, содСрТащий список доступных эффСктов. Он Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ loadPlugins() для поиска ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ всСх ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ… интСрфСйс TextArtInterface, ΠΈ заполняСт список Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” populateListWidget().

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 ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ… ΠΈΠ»ΠΈ нСсколько ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Ρ‚Π°ΠΊΠΎΠΉ интСрфСйс. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒΡΡ ΠΏΠΎΠ·ΠΆΠ΅. ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ запускС прилоТСния производится Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° всСх ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… Π½ΡƒΠΆΠ½Ρ‹ΠΉ интСрфСйс. Π­Ρ‚ΠΎ позволяСт Π»Π΅Π³ΠΊΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ прилоТСния Π±Π΅Π· измСнСния самого прилоТСния.

НаписаниС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Ρ… ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹ΠΉ ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ являСтся подклассом 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);