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

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

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

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().