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

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

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

051 void Plotter::setCurveData(int id, const QVector<QPointF> &data)

052 {

053 curveMap[id] = data;

054 refreshPixmap();

055 }

Ѐункция setCurveData() устанавливаСт Π΄Π°Π½Π½Ρ‹Π΅ для ΠΊΡ€ΠΈΠ²ΠΎΠΉ с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ. Если Π² curveMap ΡƒΠΆΠ΅ имССтся кривая с Ρ‚Π°ΠΊΠΈΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ, Π΅Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π½ΠΎΠ²Ρ‹ΠΌΠΈ значСниями; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС просто добавляСтся новая кривая. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρβ€”Ρ‡Π»Π΅Π½ curveMap ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ QMap<int, QVector<QPointF> >.

056 void Plotter::clearCurve(int id)

057 {

058 curveMap.remove(id);

059 refreshPixmap();

060 }

Ѐункция clearCurve() удаляСт Π·Π°Π΄Π°Π½Π½ΡƒΡŽ ΠΊΡ€ΠΈΠ²ΡƒΡŽ ΠΈΠ· curveMap.

061 QSize Plotter::minimumSizeHint() const

062 {

063 return QSize(6 * Margin, 4 * Margin);

064 }

Ѐункция minimumSizeHint() Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ sizeHint(); Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ функция sizeHint() устанавливаСт ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°, minimumSizeHint() Π·Π°Π΄Π°Π΅Ρ‚ ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°. ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ станСт Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρƒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Π½ΠΈΠΆΠ΅ идСального минимального Ρ€Π°Π·ΠΌΠ΅Ρ€Π°.

ΠœΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 300 Γ— 200 (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Margin Ρ€Π°Π²Π΅Π½ 50) для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠΊΠ°ΠΉΠΌΠ»ΡΡŽΡ‰ΡƒΡŽ ΠΊΡ€ΠΎΠΌΠΊΡƒ ΠΏΠΎ всСм Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ΠΌ сторонам ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ пространство для самого Π³Ρ€Π°Ρ„ΠΈΠΊΠ°. ΠŸΡ€ΠΈ ΠΌΠ΅Π½ΡŒΡˆΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ€Π°Ρ… считаСтся, Ρ‡Ρ‚ΠΎ Π³Ρ€Π°Ρ„ΠΈΠΊ Π±ΡƒΠ΄Π΅Ρ‚ слишком ΠΌΠ°Π» ΠΈ бСсполСзСн.

065 QSize Plotter::sizeHint() const

066 {

067 return QSize(12 * Margin, 8 * Margin);

068 }

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sizeHint() ΠΌΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Β«ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉΒ» Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ константы Margin, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ этого Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Ρ‚Ρƒ ΠΆΠ΅ ΡΠ°ΠΌΡƒΡŽ ΠΏΡ€ΠΈΡΡ‚Π½ΡƒΡŽ для Π³Π»Π°Π·Π° ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΡŽ 3:2, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ использовали для minimumSizeHint().

ΠœΡ‹ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅ΠΌ рассмотрСниС ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ слотов построитСля Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ² Plotter. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ событий.

069 void Plotter::paintEvent(QPaintEvent * /* event */)

070 {

071 QStylePainter painter(this);

072 painter.drawPixmap(0, 0, pixmap);

073 if (rubberBandIsShown) {

074 painter.setPen(palette().light().color());

075 painter.drawRect(rubberBandRect.normalized()

076 .adjusted(0, 0, -1, -1));

077 }


078 if (hasFocus()) {

079 QStyleOptionFocusRect option;

080 option.initFrom(this);

081 option.backgroundColor = palette().dark().color();

082 painter.drawPrimitive(QStyle::PE_FrameFocusRect, option);

083 }

084 }

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ всС дСйствия ΠΏΠΎ Ρ€ΠΈΡΠΎΠ²Π°Π½ΠΈΡŽ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ paintEvent(). Но Π² Π΄Π°Π½Π½ΠΎΠΌ случаС вся Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ° ΡƒΠΆΠ΅ нарисована Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ refreshPixmap(), ΠΈ поэтому ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ воспроизвСсти вСсь Π³Ρ€Π°Ρ„ΠΈΠΊ, просто копируя ΠΏΠΈΠΊΡΠ΅Π»ΡŒΠ½ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚Ρƒ Π² Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ (0, 0).

Если рСзиновая Π»Π΅Π½Ρ‚Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π²ΠΈΠ΄ΠΈΠΌΠΎΠΉ, ΠΌΡ‹ рисуСм Π΅Π΅ ΠΏΠΎΠ²Π΅Ρ€Ρ… Π³Ρ€Π°Ρ„ΠΈΠΊΠ°. ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ свСтлый (Β«lightΒ») ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Π² качСствС Ρ†Π²Π΅Ρ‚Π° ΠΏΠ΅Ρ€Π° для обСспСчСния Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π³ΠΎ контраста с Ρ‚Π΅ΠΌΠ½Ρ‹ΠΌ (Β«darkΒ») Ρ„ΠΎΠ½ΠΎΠΌ. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ рисуСм нСпосрСдствСнно Π½Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π΅, оставляя Π½Π΅Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚Ρ‹ΠΌ внСэкранноС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° пиксСльной ΠΊΠ°Ρ€Ρ‚Π΅. Π’Ρ‹Π·ΠΎΠ² QRect::normalized() Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΈ высоты ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° Ρ€Π΅Π·ΠΈΠ½ΠΎΠ²ΠΎΠΉ Π»Π΅Π½Ρ‚Ρ‹ (выполняя ΠΎΠ±ΠΌΠ΅Π½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ ΠΏΡ€ΠΈ нСобходимости), Π° Π²Ρ‹Π·ΠΎΠ² adjusted() ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° Π½Π° ΠΎΠ΄ΠΈΠ½ пиксСль, позволяя вывСсти Π½Π° экран Π΅Π³ΠΎ ΠΊΠΎΠ½Ρ‚ΡƒΡ€ ΡˆΠΈΡ€ΠΈΠ½ΠΎΠΉ Π² ΠΎΠ΄ΠΈΠ½ пиксСль.

Если Plotter ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ фокус, Π²Ρ‹Π²ΠΎΠ΄ фокусного ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° выполняСтся с использованиСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ drawPrimitive(), Π·Π°Π΄Π°ΡŽΡ‰Π΅ΠΉ ΡΡ‚ΠΈΠ»ΡŒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°, с ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ QStyle::PE_FrameFocusRect Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° QStyleOptionFocusRect Π² качСствС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. ΠžΠΏΡ†ΠΈΠΈ рисования фокусного ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Plotter (ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° initFrom()). Π¦Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒΡΡ явно.

Если ΠΏΡ€ΠΈ рисовании трСбуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΡΡ‚ΠΈΠ»ΡŒ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π»ΠΈΠ±ΠΎ нСпосрСдствСнно Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ QStyle, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€

style()->drawPrimitive(QStyle::PE_FrameFocusRect, &option, &painter, this);

Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ QStylePainter вмСсто ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ QPainter (ΠΊΠ°ΠΊ ΠΌΡ‹ это Π΄Π΅Π»Π°Π»ΠΈ Π² Plotter), Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ рисованиС Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ.

Ѐункция QWidget::style() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡΡ‚ΠΈΠ»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ использован для рисования Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°. Π’ Qt ΡΡ‚ΠΈΠ»ΡŒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° являСтся подклассом QStyle. ВстроСнными ΡΠ²Π»ΡΡŽΡ‚ΡΡ стили QWindowsStyle, QWindowsXPStyle, QMotifStyle, QCDEStyle, QMacStyle ΠΈ OPlastiqueStyle. ВсС эти стили ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ класса QStyle, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ рисованиС Π² стилС ΠΈΠΌΠΈΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹. Ѐункция drawPrimitive() класса QStylePainter Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ класса QStyle с Ρ‚Π΅ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для рисования Ρ‚Π°ΠΊΠΈΡ… Β«ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ²Β», ΠΊΠ°ΠΊ ΠΏΠ°Π½Π΅Π»ΠΈ, ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΈ фокусныС ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ всС Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΡΡ‚ΠΈΠ»ΡŒ прилоТСния (QApplication::style()), Π½ΠΎ Π² любом Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π΅ ΡΡ‚ΠΈΠ»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QWidget::setStyle().

ΠŸΡƒΡ‚Π΅ΠΌ создания подкласса QStyle ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΡΡ‚ΠΈΠ»ΡŒ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ с Ρ†Π΅Π»ΡŒΡŽ придания ΠΎΡ‚Π»ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… стилСвых особСнностСй ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΊΠ°ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΠΈΠ»ΠΈ Π³Ρ€ΡƒΠΏΠΏΠ΅ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π₯отя рСкомСндуСтся Π² Ρ†Π΅Π»ΠΎΠΌ ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ Β«Ρ€ΠΎΠ΄Π½ΠΎΠ³ΠΎΒ» стиля Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, Qt ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ достаточно Π³ΠΈΠ±ΠΊΠΈΠ΅ срСдства ΠΏΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ стилСм Ρ‚Π΅ΠΌ, Ρƒ ΠΊΠΎΠ³ΠΎ большая фантазия.

ВстроСнныС Π² Qt Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ ΠΏΡ€ΠΈ рисовании самих сСбя ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ зависят ΠΎΡ‚ QStyle. ИмСнно поэтому ΠΎΠ½ΠΈ выглядят СстСствСнно Π½Π° всСх ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ…, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Qt. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΊ ΡΡ‚ΠΈΠ»ΡŽ Π»ΠΈΠ±ΠΎ ΠΏΡƒΡ‚Π΅ΠΌ примСнСния QStyle (Ρ‡Π΅Ρ€Π΅Π· QStylePainter) ΠΏΡ€ΠΈ рисовании самих сСбя, Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ встроСнныС Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ Qt Π² качСствС Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ…. Π’ Plotter ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΠ±Π° ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°: фокусный ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ рисуСтся с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ QStyle, Π° ΠΊΠ½ΠΎΠΏΠΊΠΈ Zoom In ΠΈ Zoom Out ΡΠ²Π»ΡΡŽΡ‚ΡΡ встроСнными Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌΠΈ Qt.

085 void Plotter::resizeEvent(QResizeEvent * /* event */ )

086 {

087 int x= width() - (zoomInButton->width()

088 + zoomOutButton->width() + 10);

089 zoomInButton->move(x, 5);

090 zoomOutButton->move(x + zoomInButton->width() + 5, 5);

091 refreshPixmap();

092 }

ΠŸΡ€ΠΈ всяком ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Plotter Qt Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ событиС Β«ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°Β». Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ пСрСопрСдСляСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ resizeEvent() для размСщСния ΠΊΠ½ΠΎΠΏΠΎΠΊ Zoom In ΠΈ Zoom Out Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΠΏΡ€Π°Π²ΠΎΠΌ ΡƒΠ³Π»Ρƒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Plotter.

ΠœΡ‹ располагаСм ΠΊΠ½ΠΎΠΏΠΊΠΈ Zoom In ΠΈ Zoom Out рядом, отдСляя ΠΈΡ… 5-ΠΏΠΈΠΊΡΠ΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠΎΠΌ ΠΎΡ‚ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ ΠΈ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΠΊΡ€Π°Π΅Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°.

Если Π±Ρ‹ Π½Π°ΠΌ Π·Π°Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ эти ΠΊΠ½ΠΎΠΏΠΊΠΈ Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ Π»Π΅Π²ΠΎΠΌ ΡƒΠ³Π»Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ (0, 0), ΠΌΡ‹ Π±Ρ‹ просто пСрСмСстили ΠΈΡ… Ρ‚ΡƒΠ΄Π° Π² конструкторС Plotter. Но ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π½Π°Ρ…ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΠΏΡ€Π°Π²ΠΎΠΌ ΡƒΠ³Π»Ρƒ, ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ зависят ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°. По этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ resizeEvent() ΠΈ Π² Π½Π΅ΠΉ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΎΠΊ.

ΠœΡ‹ Π½Π΅ устанавливали ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΊΠ½ΠΎΠΏΠΎΠΊ Π² конструкторС Plotter. Π­Ρ‚ΠΎ сдСлано ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Qt всСгда Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ событиС измСнСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π΄ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ появлСния Π½Π° экранС Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°.

Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ resizeEvent() ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΡŽ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Β«Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽΒ» ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, QGridLayout). ΠŸΡ€ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ это Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ слоТнСС ΠΈ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π» Π±Ρ‹ большС рСсурсов; с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, это Π΄Π°Π»ΠΎ Π±Ρ‹ элСгантноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ справа Π½Π°Π»Π΅Π²ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для Ρ‚Π°ΠΊΠΈΡ… языков, ΠΊΠ°ΠΊ арабский ΠΈ СврСйский.

Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ refreshPixmap() для пСрСрисовки пиксСльной ΠΊΠ°Ρ€Ρ‚Ρ‹ с Π½ΠΎΠ²Ρ‹ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ.

093 void Plotter::mousePressEvent(QMouseEvent *event)

094 {

095 QRect rect(Margin, Margin,

096 width() - 2 * Margin, height() - 2 * Margin);

097 if (event->button() == Qt::LeftButton) {

098 if (rect.contains(event->pos())) {

099 rubberBandIsShown = true;

100 rubberBandRect.setTopLeft(event->pos());

101 rubberBandRect.setBottomRight(event->pos());

102 updateRubberBandRegion();

103 setCursor(Qt::CrossCursor);

104 }

105 }

106 }

Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ Π»Π΅Π²ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΌΡ‹ΡˆΠΊΠΈ, ΠΌΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π½Π° экранС Ρ€Π΅Π·ΠΈΠ½ΠΎΠ²ΡƒΡŽ Π»Π΅Π½Ρ‚Ρƒ. Для этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ„Π»Π°ΠΆΠΎΠΊ rubberBandIsShown Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽβ€”Ρ‡Π»Π΅Π½ rubberBandRect Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ курсора ΠΌΡ‹ΡˆΠΊΠΈ, ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ событиС рисования для вычСрчивания Ρ€Π΅Π·ΠΈΠ½ΠΎΠ²ΠΎΠΉ Π»Π΅Π½Ρ‚Ρ‹ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ курсора ΠΌΡ‹ΡˆΠΊΠΈ Π½Π° пСрСкрСстиС.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ rubberBandRect ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ QRect. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ QRect ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π»ΠΈΠ±ΠΎ Ρ‡Π΅Ρ‚Ρ‹Ρ€ΡŒΠΌΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ (x, Ρƒ, w, h), Π³Π΄Π΅ (x, Ρƒ) являСтся ΠΏΠΎΠ·ΠΈΡ†ΠΈΠ΅ΠΉ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ ΡƒΠ³Π»Π° ΠΈ w Γ— h опрСдСляСт Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ…ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°, Π»ΠΈΠ±ΠΎ ΠΏΠ°Ρ€ΠΎΠΉ Ρ‚ΠΎΡ‡Π΅ΠΊ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΈ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΡƒΠ³Π»ΠΎΠ². Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ с ΠΏΠ°Ρ€ΠΎΠΉ Ρ‚ΠΎΡ‡Π΅ΠΊ. Π’ΠΎ мСсто, Π³Π΄Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π· Ρ‰Π΅Π»ΠΊΠ½ΡƒΠ» ΠΌΡ‹ΡˆΠΊΠΎΠΉ, становится Π²Π΅Ρ€Ρ…Π½ΠΈΠΌ Π»Π΅Π²Ρ‹ΠΌ ΡƒΠ³Π»ΠΎΠΌ, Π° тСкущая позиция курсора опрСдСляСт ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΡƒΠ³Π»Π°. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ updateRubberBandRegion() для ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ пСрСрисовки (нСбольшой) области, ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Ρ€Π΅Π·ΠΈΠ½ΠΎΠ²ΠΎΠΉ Π»Π΅Π½Ρ‚ΠΎΠΉ.