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(Β«&Β», Β«<Β», Β«>Β»). ΠΠ°ΡΠ΅ΠΌ ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ 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;