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

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

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

09 painter.setViewport(rect.x(). rect.y(), size.width(), size.height());

10 painter.setWindow (image.rect());

11 painter.drawImage(0, 0, image);

12 }

13 }

Рис. 8.12. Π’Ρ‹Π²ΠΎΠ΄ Π½Π° ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽΡ‰Π΅Π΅ устройство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° QImage.

ΠœΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ класс PrintWindow ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽβ€”Ρ‡Π»Π΅Π½ printer Ρ‚ΠΈΠΏΠ° QPrinter. ΠœΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ просто ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ QPrinter Π² стСк Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printImage(), Π½ΠΎ Ρ‚ΠΎΠ³Π΄Π° Π½Π΅ ΡΠΎΡ…Ρ€Π°Π½ΡΠ»ΠΈΡΡŒ Π±Ρ‹ настройки ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΉ.

ΠœΡ‹ создаСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QPrintDialog ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ exec() для Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π° экран Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ. Оно Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠ°Π» ΠΊΠ½ΠΎΠΏΠΊΡƒ OK; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ false. ПослС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exec() ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QPrinter Π³ΠΎΡ‚ΠΎΠ² для использования. (МоТно Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ QPrintDialog, Π° Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ вызывая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈβ€”Ρ‡Π»Π΅Π½Ρ‹ класса QPrinter для ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ.)

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ создаСм QPainter для рисования Π½Π° QPrinter. ΠœΡ‹ устанавливаСм ΠΎΠΊΠ½ΠΎ Π½Π° ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ изобраТСния ΠΈ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ отобраТСния Π½Π° ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ΠΌ сторон, ΠΈ ΠΌΡ‹ рисуСм ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ (0, 0).

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠΊΠ½ΠΎ QPrinter инициализируСтся Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‰Π°Ρ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ‚Π΅Ρ€Π° Π±ΡƒΠ΄Π΅Ρ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‰Π΅ΠΉ способности экрана (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ½Π° составляСт ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΎΡ‚ 72 Π΄ΠΎ 100 Ρ‚ΠΎΡ‡Π΅ΠΊ Π½Π° дюйм), позволяя Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΠΎ Ρ€ΠΈΡΠΎΠ²Π°Π½ΠΈΡŽ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°. Π—Π΄Π΅ΡΡŒ это Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ сами Π·Π°Π΄Π°Π»ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ нашСго ΠΎΠΊΠ½Π°.

Π’Ρ‹Π²ΠΎΠ΄ Π½Π° ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽΡ‰Π΅Π΅ устройство элСмСнтов, Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΡ… Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠΉ страницы, выполняСтся достаточно просто, Π½ΠΎ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… прилоТСниях приходится ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ нСсколько страниц. Π’ Ρ‚Π°ΠΊΠΈΡ… случаях ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ сначала Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ страницу ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ newPage() для ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ страницу. Π—Π΄Π΅ΡΡŒ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° опрСдСлСния Ρ‚ΠΎΠ³ΠΎ количСства ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ страницС. БущСствуСт Π΄Π²Π° ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ многостраничных Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² Qt:

β€’ ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ наши Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ HTML ΠΈ Π·Π°Ρ‚Π΅ΠΌ воспроизвСсти ΠΈΡ… с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ класса QTextDocument, процСссора Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ тСкста Qt.

β€’ ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ рисованиС ΠΈ Ρ€Π°Π·Π±ΠΈΠ²ΠΊΡƒ Π½Π° страницы Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ.

ΠœΡ‹ рассмотрим ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΎΠ±Π° ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΡ‹ распСчатаСм Ρ†Π²Π΅Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ справочник: список Π½Π°Π·Π²Π°Π½ΠΈΠΉ Ρ†Π²Π΅Ρ‚ΠΎΠ² с тСкстовым описаниСм. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт этого справочника прСдставляСтся строкой Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Β«Π½Π°Π·Π²Π°Π½ΠΈΠ΅: описаниС», Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Miltonopsis santanae: Π‘Π°ΠΌΡ‹ΠΉ опасный Π²ΠΈΠ΄ ΠΎΡ€Ρ…ΠΈΠ΄Π΅ΠΈ.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚ΠΊΠ° прСдставлСны ΠΎΠ΄Π½ΠΎΠΉ строкой, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ†Π²Π΅Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ справочник ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° QStringList. НиТС приводится функция ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ Ρ†Π²Π΅Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ справочника, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ процСссор Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ тСкста Qt:

01 void PrintWindow::printFlowerGuide(const QStringList &entries)

02 {

03 QString html;

04 foreach(QString entry, entries) {

05 QStringList fields = entry.split(": ");

06 QString title = Qt::escape(fields[0]);

07 QString body = Qt::escape(fields[1]);

08 html = "<table width=\"100%\" border=1 cellspacing=0>\n"

09 "<tr><td bgcolor=\"lightgray\"><font size=\"+1\">"

10 "<b><i>" + title + "</i></b></font>\n<tr><td>" + body"

11 + "\n</table>\n<br>\n";

12 }

13 printHtml(html);

14 }

На ΠΏΠ΅Ρ€Π²ΠΎΠΌ этапС QStringList прСобразуСтся Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ HTML. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚ΠΎΠΊ прСдставляСтся Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ HTML с двумя ячСйками. ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Qt::escape() для Π·Π°ΠΌΠ΅Π½Ρ‹ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… символов Β«&Β», Β«<Β», Β«>Β» Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ элСмСнты Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° HTML(Β«&amp;Β», Β«&lt;Β», Β«&gt;Β»). Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ printHtml() для ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ тСкста.

01 void PrintWindow::printHtml(const QString &html)

02 {

03 QPrintDialog printDialog(&printer, this);

04 if (printDialog.exec()) {

05 QPainter painter(&printer);

06 QTextDocument textDocument;

07 textDocument.setHtml(html);

08 textDocument.print(&printer);

09 }

10 }

Ѐункция printHtml() Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ QPrintDialog ΠΈ выполняСт ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° HTML. Она ΠΌΠΎΠΆΠ΅Ρ‚ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² любом ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Qt для распСчатки страниц ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ тСкста Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ HTML.

Рис. 8.13. Π’Ρ‹Π²ΠΎΠ΄ Π½Π° ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ Ρ†Π²Π΅Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ справочника с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ QTextDocument.

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ HTML ΠΈ использованиС QTextDocument для Π΅Π³ΠΎ распСчатки ΡΠ²Π»ΡΡŽΡ‚ΡΡ самым ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ способом ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠ² ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… слоТных Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π’ Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° трСбуСтся ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ больший ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΡƒ страниц ΠΈ ΠΈΡ… рисованиС. Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ посмотрим, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ Ρ†Π²Π΅Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ справочник ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ класса QPainter. НиТС приводится новая вСрсия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printFlowerGuide():

01 void PrintWindow::printFlowerGuide(const QStringList &entries)

02 {

03 QPrintDialog printDialog(&printer, this);

04 if (printDialog.exec()) {

05 QPainter painter(&printer);

06 QList<QStringList> pages;

07 paginate(&painter, &pages, entries);

08 printPages(&painter, pages);

09 }

10 }

ПослС настройки ΠΏΡ€ΠΈΠ½Ρ‚Π΅Ρ€Π° ΠΈ построСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ€ΠΈΡΠΎΠ²Π°Π»ΡŒΡ‰ΠΈΠΊΠ° ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ paginate() для опрСдСлСния содСрТимого ΠΊΠ°ΠΆΠ΄ΠΎΠΉ страницы. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ получаСтся Π²Π΅ΠΊΡ‚ΠΎΡ€ списков QStringList, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ список QStringList содСрТит элСмСнты ΠΎΠ΄Π½ΠΎΠΉ страницы. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printPages().

НапримСр, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ†Π²Π΅Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ справочник содСрТит всСго 6 элСмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΠΌ Π±ΡƒΠΊΠ²Π°ΠΌΠΈ А, Π‘, Π’, Π“, Π” ΠΈ E. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ имССтся достаточно мСста для элСмСнтов А ΠΈ Π‘ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ страницС, Π’, Π“ ΠΈ Π” Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ страницС ΠΈ Π• Π½Π° Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ страницС. Π’ΠΎΠ³Π΄Π° список pages содСрТал Π±Ρ‹ список [А, Π‘] Π² элСмСнтС с индСксом 0, список [Π’, Π“, Π”] Π² элСмСнтС с индСксом 1 ΠΈ список [E] Π² элСмСнтС с индСксом 2.

01 void PrintWindow::paginate(QPainter *painter, QList<QStringList> *pages,

02 const QStringList &entries)

03 {

04 QStringList currentPage;

05 int pageHeight = painter->window().height() - 2 * LargeGap;

06 int Ρƒ = 0;

07 foreach (QString entry, entries) {

08 int height = entryHeight(painter, entry);

09 if (Ρƒ + height > pageHeight && !currentPage.empty()) {

10 pages->append(currentPage);

11 currentPage.clear();

12 y = 0;

13 }

14 currentPage.append(entry);

15 Ρƒ += height + MediumGap;

16 }

17 if (!currentPage.empty())

18 pages->append(currentPage);

19 }

Ѐункция paginate() распрСдСляСт элСмСнты справочника Ρ†Π²Π΅Ρ‚ΠΎΠ² ΠΏΠΎ страницам. Π•Π΅ Ρ€Π°Π±ΠΎΡ‚Π° основана Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ entryHeight(), Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ высоту ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта. Она Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ свСрху ΠΈ снизу страницы ΠΏΠΎΠ»Π΅ΠΉ с Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ LargeGap.

ΠœΡ‹ выполняСм Ρ†ΠΈΠΊΠ» ΠΏΠΎ элСмСнтам ΠΈ добавляСм ΠΈΡ… Π² ΠΊΠΎΠ½Π΅Ρ† Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ страницы Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ окаТСтся, Ρ‡Ρ‚ΠΎ элСмСнт Π½Π΅ вмСщаСтся Π½Π° страницу; Π·Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ добавляСм Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ страницу Π² ΠΊΠΎΠ½Π΅Ρ† списка pages ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ страницу.

01 int PrintWindow::entryHeight(QPainter *painter, const QString &entry)

02 {

03 int textWidth = painter->window().width() - 2 * SmallGap;

04 QString title = fields[0];

05 QString body = fields[1];

06 QStringList fields = entry.split(": ");

07 int maxHeight = painter->window().height();

08 painter->setFont(titleFont);

09 QRect titleRect = painter->boundingRect(0, 0, textWidth, maxHeight,

10 Qt::TextWordWrap, title);

11 painter->setFont(bodyFont);

12 QRect bodyRect = painter->boundingRect(0, 0, textWidth, maxHeight,

13 Qt::TextWordWrap, body);

14 return titleRect.height() + bodyRect.height() + 4 * SmallGap;

15 }

Ѐункция entryHeight() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ QPainter::boundingRect() для вычислСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° области, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠΉ ΠΎΠ΄Π½ΠΈΠΌ элСмСнтом ΠΏΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ. На рис. 8.14 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ° элСмСнтов ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚ΠΊΠ° Π½Π° страницС ΠΈ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ смысл констант SmallGap ΠΈ MediumGap.

Рис. 8.14. Компоновка элСмСнтов справочника Ρ†Π²Π΅Ρ‚ΠΎΠ² Π½Π° страницС.

01 void PrintWindow::printPages(QPainter *painter,

02 const QList<QStringList> &pages)

03 {

04 int firstPage = printer.fromPage() - 1;

05 if (firstPage >= pages.size())

06 return;

07 if (firstPage == -1)

08 firstPage = 0;

09 int lastPage = printer.toPage() - 1;

10 if (lastPage == -1 || lastPage >= pages.size())

11 lastPage = pages.size() - 1;

12 int numPages = lastPage - firstPage + 1;