13 for (int i = 0; i < printer.numCopies(); ++i) {
14 for (int j = 0; j < numPages; ++j) {
15 if (i != 0 || j != 0)
16 printer.newPage();
17 int index;
18 if (printer.pageOrder() == QPrinter::FirstPageFirst) {
19 index = firstPage + j;
20 } else {
21 index = lastPage - j;
22 }
23 printPage(painter, pages[index], index + 1);
24 }
25 }
26 }
Π€ΡΠ½ΠΊΡΠΈΡ printPages() ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° Π΄Π»Ρ ΠΏΠ΅ΡΠ°ΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ printPage() Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΡΠ»Π° ΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ. ΠΡΠΈΠΌΠ΅Π½ΡΡ QPrintDialog, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ Π·Π°ΠΏΡΠΎΡΠΈΡΡ ΡΠ°ΡΠΏΠ΅ΡΠ°ΡΠΊΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΊΠΎΠΏΠΈΠΉ, ΡΠΊΠ°Π·Π°ΡΡ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΡΡΡΠ°Π½ΠΈΡ ΠΈΠ»ΠΈ Π·Π°ΠΏΡΠΎΡΠΈΡΡ ΡΠ°ΡΠΏΠ΅ΡΠ°ΡΠΊΡ ΡΡΡΠ°Π½ΠΈΡ Π² ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ. ΠΡ ΡΠ°ΠΌΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΠΊΠ»ΡΡΠ°ΡΡ ΠΈΠ»ΠΈ ΠΎΡΠΊΠ»ΡΡΠ°ΡΡ ΡΡΠΈ ΠΎΠΏΡΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠ½ΠΊΡΠΈΡ QPrintDialog::setEnabledOptions().
ΠΡ Π½Π°ΡΠΈΠ½Π°Π΅ΠΌ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΠΏΠ΅ΡΠ°ΡΠΈ. Π€ΡΠ½ΠΊΡΠΈΠΈ QPrinter fromPage() ΠΈ toPage() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Π·Π°Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ Π½ΠΎΠΌΠ΅ΡΠ° ΡΡΡΠ°Π½ΠΈΡ ΠΈΠ»ΠΈ 0, Π΅ΡΠ»ΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π½Π΅ ΡΠΊΠ°Π·Π°Π½. ΠΡ Π²ΡΡΠΈΡΠ°Π΅ΠΌ 1, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½Π°Ρ ΡΠΏΠΈΡΠΎΠΊ ΡΡΡΠ°Π½ΠΈΡ pages Π½ΡΠΌΠ΅ΡΡΠ΅ΡΡΡ Ρ Π½ΡΠ»Ρ, ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ firstPage ΠΈ lastPage (ΠΏΠ΅ΡΠ²Π°Ρ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ) Π½Π° ΠΎΡ Π²Π°Ρ Π²ΡΠ΅Ρ ΡΡΡΠ°Π½ΠΈΡ, Π΅ΡΠ»ΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π½Π΅ Π·Π°Π΄Π°Π½ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ.
ΠΠ°ΡΠ΅ΠΌ ΠΌΡ ΠΏΠ΅ΡΠ°ΡΠ°Π΅ΠΌ ΠΊΠ°ΠΆΠ΄ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ. ΠΠ½Π΅ΡΠ½ΠΈΠΉ ΡΠΈΠΊΠ» for ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΠΊΠΎΠΏΠΈΠΉ, Π·Π°ΠΏΡΠΎΡΠ΅Π½Π½ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ. ΠΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠ² ΠΏΡΠΈΠ½ΡΠ΅ΡΠΎΠ² ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΏΠ΅ΡΠ°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΊΠΎΠΏΠΈΠΉ, ΠΏΠΎΡΡΠΎΠΌΡ Π΄Π»Ρ Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΡ QPrinter::numCopies() Π²ΡΠ΅Π³Π΄Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ 1. ΠΡΠ»ΠΈ Π΄ΡΠ°ΠΉΠ²Π΅Ρ ΠΏΡΠΈΠ½ΡΠ΅ΡΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠ΅ΡΠ°ΡΠ°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠΏΠΈΠΉ, numCopies() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠΏΠΈΠΉ, Π·Π°ΠΏΡΠΎΡΠ΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ, ΠΈ Π·Π° ΠΏΠ΅ΡΠ°ΡΡ ΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΊΠΎΠΏΠΈΠΉ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. (Π ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Ρ QImage, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΡΠ°Π½Π΅Π΅ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅, ΠΌΡ Π΄Π»Ρ ΠΏΡΠΎΡΡΠΎΡΡ ΠΏΡΠΎΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°Π»ΠΈ numCopies().)
Π ΠΈΡ. 8.15 Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ΅Π½ 8.13.
ΠΠ½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΡΠΈΠΊΠ» for Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΠΎ Π²ΡΠ΅ΠΌ ΡΡΡΠ°Π½ΠΈΡΠ°ΠΌ. ΠΡΠ»ΠΈ ΡΡΡΠ°Π½ΠΈΡΠ° Π½Π΅ ΠΏΠ΅ΡΠ²Π°Ρ, ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ newPage(), ΡΡΠΎΠ±Ρ ΡΠ±ΡΠΎΡΠΈΡΡ Π½Π° ΠΏΠ΅ΡΠ°ΡΠ°ΡΡΠ΅Π΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ ΡΡΠ°ΡΡΡ ΡΡΡΠ°Π½ΠΈΡΡ ΠΈ Π½Π°ΡΠ°ΡΡ ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΡ. ΠΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ printPage() Π΄Π»Ρ ΡΠ°ΡΠΏΠ΅ΡΠ°ΡΠΊΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΡ.
01 void PrintWindow::printPage(QPainter *painter,
02 const QStringList &entries, int pageNumber)
03 {
04 painter->save();
05 painter->translate(0, LargeGap);
06 foreach (QString entry, entries) {
07 QStringList fields = entry.split(": ");
08 QString title = fields[0];
09 QString body = fields[1];
10 printBox(painter, title, titleFont, Qt::lightGray);
11 printBox(painter, body, bodyFont, Qt::white);
12 painter->translate(0, MediumGap);
13 }
14 painter->restore();
15 painter->setFont(footerFont);
16 painter->drawText(painter->window(),
17 Qt::AlignHCenter | Qt::AlignBottom,
18 QString::number(pageNumber));
19 }
Π€ΡΠ½ΠΊΡΠΈΡ printPage() ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ Π² ΡΠΈΠΊΠ»Π΅ Π²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΈΠΊΠ° ΡΠ²Π΅ΡΠΎΠ² ΠΈ ΠΏΠ΅ΡΠ°ΡΠ°Π΅Ρ ΠΈΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ Π΄Π²ΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ printBox(): ΠΎΠ΄ΠΈΠ½ Π΄Π»Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° (Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΠ²Π΅ΡΠΊΠ°) ΠΈ Π΄ΡΡΠ³ΠΎΠΉ Π΄Π»Ρ Β«ΡΠ΅Π»Π°Β» (ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠ²Π΅ΡΠΊΠ°). ΠΠ½Π° ΡΠ°ΠΊΠΆΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ Π½ΠΎΠΌΠ΅Ρ ΡΡΡΠ°Π½ΠΈΡΡ Π²Π½ΠΈΠ·Ρ ΠΏΠΎ ΡΠ΅Π½ΡΡΡ ΡΡΡΠ°Π½ΠΈΡΡ.
01 void PrintWindow::printBox(QPainter *painter, const QString &str,
02 const QFont &font, const QBrush &brush)
03 {
04 painter->setFont(font);
05 int boxWidth = painter->window().width();
06 int textWidth = boxWidth - 2 * SmallGap;
07 int maxHeight = painter->window().height();
08 QRect textRect = painter->boundingRect(SmallGap, SmallGap,
09 textWidth, maxHeight, Qt::TextWordWrap, str);
10 int boxHeight = textRect.height() + 2 * SmallGap;
11 painter->setPen(QPen(Qt::black, 2, Qt::SolidLine));
12 painter->setBrush(brush);
13 painter->drawRect(0, 0, boxWidth, boxHeight);
14 painter->drawText(textRect, Qt::TextWordWrap, str);
15 painter->translate(0, boxHeight);
16 }
Π ΠΈΡ. 8.16. ΠΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ° ΡΡΡΠ°Π½ΠΈΡΡ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΈΠΊΠ° ΠΏΠΎ ΡΠ²Π΅ΡΠ°ΠΌ.
Π€ΡΠ½ΠΊΡΠΈΡ printBox() Π²ΡΡΠ΅ΡΡΠΈΠ²Π°Π΅Ρ ΠΊΠΎΠ½ΡΡΡ Π±Π»ΠΎΠΊΠ°, Π·Π°ΡΠ΅ΠΌ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΡΠ΅ΠΊΡΡ Π²Π½ΡΡΡΠΈ Π½Π΅Π³ΠΎ.
ΠΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΡΠ΅Π΄ΡΡΠ²Π° OpenGL
OpenGL ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΠΌ Π΄Π»Ρ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡ Π³ΡΠ°ΡΠΈΠΊΠΈ 2D ΠΈ 3D. ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Qt ΠΌΠΎΠ³ΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ Π³ΡΠ°ΡΠΈΠΊΡ 3D, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ QtOpenGL, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°ΡΡΡΠΈΡΠ°Π½ Π½Π° ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ OpenGL. ΠΡΠΈ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π·Π΄Π΅Π»Π° ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ, ΡΡΠΎ Π²Ρ Π·Π½Π°ΠΊΠΎΠΌΡ Ρ OpenGL. ΠΡΠ»ΠΈ Π²Ρ Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌΡ Ρ OpenGL, Ρ ΠΎΡΠΎΡΠΎ Π½Π°ΡΠΈΠ½Π°ΡΡ Π΅Π³ΠΎ ΠΈΠ·ΡΡΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΡΠ° http://www.opengl.org/.
Π ΠΈΡ. 8.17. ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π’Π΅ΡΡΠ°ΡΠ΄Ρ.
ΠΡΠ²ΠΎΠ΄ Π³ΡΠ°ΡΠΈΠΊΠΈ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ OpenGL Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Qt Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ: ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡ QGLWidget, ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΈ ΡΠΎΠ±ΡΠ°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΌΠ΅ΡΡΠ΅ Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΠΌΠΈ QtOpenGL ΠΈ OpenGL. ΠΠ·-Π·Π° ΡΠΎΠ³ΠΎ, ΡΡΠΎ QGLWidget Π½Π°ΡΠ»Π΅Π΄ΡΠ΅Ρ QWidget, Π±ΠΎΠ»ΡΡΠ°Ρ ΡΠ°ΡΡΡ Π½Π°ΡΠΈΡ Π·Π½Π°Π½ΠΈΠΉ ΠΎΡΡΠ°Π΅ΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠΎΠΉ ΠΈ Π·Π΄Π΅ΡΡ. ΠΡΠ½ΠΎΠ²Π½ΠΎΠ΅ ΠΎΡΠ»ΠΈΡΠΈΠ΅ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π²ΠΌΠ΅ΡΡΠΎ QPainter Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ OpenGL.
ΠΠ»Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΈ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΠΊΠΎΠ΄ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π’Π΅ΡΡΠ°ΡΠ΄Ρ, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π½Π° ΡΠΈΡ. 8.17. ΠΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ ΡΠ΅ΡΡΠ°ΡΠ΄Ρ ΠΈΠ»ΠΈ ΡΠ΅ΡΡΡΠ΅Ρ Π³ΡΠ°Π½Π½ΠΈΠΊ, Π³ΡΠ°Π½ΠΈ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΈΠΌΠ΅ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠ²Π΅ΡΠ°. ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ²ΠΎΡΠ°ΡΠΈΠ²Π°ΡΡ ΡΠ΅ΡΡΠ°ΡΠ΄Ρ, Π½Π°ΠΆΠΈΠΌΠ°Ρ ΠΊΠ½ΠΎΠΏΠΊΡ ΠΌΡΡΠΊΠΈ ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Ρ Π΅Π΅. ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ Π·Π°Π΄Π°Π²Π°ΡΡ ΡΠ²Π΅Ρ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ Π³ΡΠ°Π½ΠΈ ΠΏΡΡΠ΅ΠΌ Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ ΡΠ΅Π»ΡΠΊΠ° Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ Π²ΡΠ±ΠΎΡΠΎΠΌ ΡΠ²Π΅ΡΠ° Π² Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅ QColorDialog, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠ΄Π°Π΅ΡΡΡ Π½Π° ΡΠΊΡΠ°Π½.
01 class Tetrahedron : public QGLWidget
02 {
03 Q_OBJECT
04 public:
05 Tetrahedron(QWidget *parent = 0);
06 protected:
07 void initializeGL();
08 void resizeGL(int width, int height);
09 void paintGL();
10 void mousePressEvent(QMouseEvent *event);
11 void mouseMoveEvent(QMouseEvent *event);
12 void mouseDoubleClickEvent(QMouseEvent *event);
13 private:
14 void draw();
15 int faceAtPosition(const QPoint &pos);
16 GLfloat rotationX;
17 GLfloat rotationY;
18 GLfloat rotationZ;
19 QColor faceColors[4];
20 QPoint lastPos;
21 }
ΠΠ»Π°ΡΡ Tetrahedron Π½Π°ΡΠ»Π΅Π΄ΡΠ΅Ρ QGLWidget. Π€ΡΠ½ΠΊΡΠΈΠΈ ΠΊΠ»Π°ΡΡΠ° QGLWidget initializeGL(), resizeGL() ΠΈ paintGL() ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ. ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ ΠΌΡΡΠΊΠΈ ΠΊΠ»Π°ΡΡΠ° QWidget ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ ΠΎΠ±ΡΡΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.
01 Tetrahedron::Tetrahedron(QWidget *parent)
02 : QGLWidget(parent)
03 {
04 setFormat(QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer)
05 rotationX = -21.0;
06 rotationY = -57.0;
07 rotationZ = 0.0;
08 faceColors[0] = Qt::red;
09 faceColors[1] = Qt::green;
10 faceColors[2] = Qt::blue;
11 faceColors[3] = Qt::yellow;
12 }
Π ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ΅ ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ QGLWidget::setFormat() Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° ΡΠΊΡΠ°Π½Π° OpenGL ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π·Π°ΠΊΡΡΡΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΡΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°.
01 void Tetrahedron::initializeGL()
02 {
03 qglClearColor(Qt::black);
04 glShadeModel(GL_FLAT);
05 glEnable(GL_DEPTH_TEST);
06 glEnable(GL_CULL_FACE);
07 }
Π€ΡΠ½ΠΊΡΠΈΡ initializeGL() Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· ΠΏΠ΅ΡΠ΅Π΄ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ paintGL(). ΠΠΌΠ΅Π½Π½ΠΎ Π² ΡΡΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°Π΄Π°Π²Π°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡ OpenGL, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΡΠΏΠΈΡΠΊΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΎΡΡΠ°Π»ΡΠ½ΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ.
ΠΠ΅ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΠΊΠΎΠ΄ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ OpenGL, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ qglClearColor() ΠΊΠ»Π°ΡΡΠ° QGLWidget. ΠΡΠ»ΠΈ Π±Ρ ΠΌΡ Π·Π°Ρ ΠΎΡΠ΅Π»ΠΈ ΡΡΡΠΎΠ³ΠΎ ΠΏΡΠΈΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ OpenGL, ΠΌΡ Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ Π²ΡΠ·ΡΠ²Π°Π»ΠΈ Π±Ρ ΡΡΠ½ΠΊΡΠΈΡ glClearColor() ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ΅ΠΆΠΈΠΌΠ° RGBA ΠΈ glClearIndex() ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ΅ΠΆΠΈΠΌΠ° ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠ²Π΅ΡΠΎΠ².
01 void Tetrahedron::resizeGL(int width, int height)
02 {
03 glViewport(0, 0, width, height);
04 glMatrixMode(GL_PROJECTION);
05 glLoadIdentity();
06 GLfloat x = GLfloat(width) / height;
07 glFrustum(-x, x, -1.0, 1.0, 4.0, 15.0);
08 glMatrixMode(GL_MODELVIEW);
09 }
Π€ΡΠ½ΠΊΡΠΈΡ resizeGL() Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· ΠΏΠ΅ΡΠ΅Π΄ ΠΏΠ΅ΡΠ²ΡΠΌ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ paintGL(), Π½ΠΎ ΠΏΠΎΡΠ»Π΅ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ initializeGL(). OΠ½a ΡΠ°ΠΊΠΆΠ΅ Π²ΡΠ΅Π³Π΄Π° Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π²ΠΈΠ΄ΠΆΠ΅ΡΠ°. ΠΠΌΠ΅Π½Π½ΠΎ Π² ΡΡΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°Π΄Π°Π²Π°ΡΡ ΠΎΠ±Π»Π°ΡΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ OpenGL, Π΅Π΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡ ΠΈ Π΄Π΅Π»Π°ΡΡ Π»ΡΠ±ΡΠ΅ Π΄ΡΡΠ³ΠΈΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ, Π·Π°Π²ΠΈΡΡΡΠΈΠ΅ ΠΎΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π²ΠΈΠ΄ΠΆΠ΅ΡΠ°.
01 void Tetrahedron::paintGL()
02 {
03 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
04 draw();
05 }
Π€ΡΠ½ΠΊΡΠΈΡ paintGL() Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π²ΡΡΠΊΠΈΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π²ΠΈΠ΄ΠΆΠ΅Ρ. ΠΡΠΎ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ QWidget::paintEvent(), Π½ΠΎ Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΊΠ»Π°ΡΡΠ° QPainter Π·Π΄Π΅ΡΡ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ OpenGL. Π Π΅Π°Π»ΡΠ½ΠΎΠ΅ ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π·Π°ΠΊΡΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ draw().