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

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

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

Π‘Ρ€Π΅Π΄ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…β€”Ρ‡Π»Π΅Π½ΠΎΠ² находится pixmap, которая ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ QPixmap. Π­Ρ‚Π° пСрСмСнная содСрТит копию всСго Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΡƒΡŽ Π΅Π³ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ Π½Π° экранС. Π“Ρ€Π°Ρ„ΠΈΠΊ всСгда сначала строится Π²Π½Π΅ экрана Π½Π° пиксСльной ΠΊΠ°Ρ€Ρ‚Π΅, ΠΈ Π·Π°Ρ‚Π΅ΠΌ пиксСльная ΠΊΠ°Ρ€Ρ‚Π° помСщаСтся Π½Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚.

45 class PlotSettings

46 {

47 public:

48 PlotSettings();


49 void scroll(int dx, int dy);

50 void adjust();

51 double spanX() const { return maxX - minX; }

52 double spanY() const { return maxY - minY; }


53 double minX;

54 double maxX;

55 int numXTicks;

56 double minY;

57 double maxY;

58 int numYTicks;


59 private:

60 static void adjustAxis(double &min, double &max, int &numTicks);

61 };

62 #endif

Класс PlotSettings Π·Π°Π΄Π°Π΅Ρ‚ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ осям x ΠΈ y ΠΈ количСство ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΎΠΊ Π½Π° этих осях. На рис. 5.8 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ соотвСтствиС ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ PlotSettings ΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠΌ Plotter.

По условному соглашСнию Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² numXTicks ΠΈ numYTicks задаСтся Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ мСньшС; Ссли numXTicks Ρ€Π°Π²Π½ΠΎ 5, Plotter Π±ΡƒΠ΄Π΅Ρ‚ Π½Π° самом Π΄Π΅Π»Π΅ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ 6 ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΎΠΊ ΠΏΠΎ оси x. Π­Ρ‚ΠΎ упростит расчСты Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ.

Рис. 5.8. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅β€”Ρ‡Π»Π΅Π½Ρ‹ настроСк Π³Ρ€Π°Ρ„ΠΈΠΊΠ° PlotSettings.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Ρ„Π°ΠΉΠ» Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

001 #include <QtGui>

002 #include <cmath>

003 #include "plotter.h"

ΠœΡ‹ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ всС символы пространства ΠΈΠΌΠ΅Π½ std Π² глобальноС пространство ΠΈΠΌΠ΅Π½. Π­Ρ‚ΠΎ позволяСт Π½Π°ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступ ΠΊ функциям, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΌ Π² <cmath>, Π±Π΅Π· указания прСфикса std:: (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, floor() вмСсто std::floor()).

004 Plotter::Plotter(QWidget *parent)

005 : QWidget(parent)

006 {

007 setBackgroundRole(QPalette::Dark);

008 setAutoFillBackground(true);

009 setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

010 setFocusPolicy(Qt::StrongFocus);

011 rubberBandIsShown = false;


012 zoomInButton = new QToolButton(this);

013 zoomInButton->setIcon(QIcon(":/images/zoomin.png"));

014 zoomInButton->adjustSize();

015 connect(zoomInButton, SIGNAL(clicked()), this, SLOT(zoomIn()));


016 zoomOutButton = new QToolButton(this);

017 zoomOutButton->setIcon(QIcon(":/images/zoomout.png"));

018 zoomOutButton->adjustSize();

019 connect(zoomOutButton, SIGNAL(clicked()), this, SLOT(zoomOut()));


020 setPlotSettings(PlotSettings());

021 }

Π’Ρ‹Π·ΠΎΠ² setBackgroundRole() ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ QWidget Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ использования для Ρ†Π²Π΅Ρ‚Π° стирания Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Β«Ρ‚Π΅ΠΌΠ½ΠΎΠ³ΠΎΒ» ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹ вмСсто ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Β«windowΒ» (ΠΎΠΊΠ½ΠΎ). Π­Ρ‚ΠΈΠΌ ΠΌΡ‹ опрСдСляСм Ρ†Π²Π΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Qt ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для заполнСния Π»ΡŽΠ±Ρ‹Ρ… вновь ΠΏΠΎΡΠ²ΠΈΠ²ΡˆΠΈΡ…ΡΡ пиксСлСй ΠΏΡ€ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ΠΏΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ paintEvent() ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ рисования Π½ΠΎΠ²ΠΎΠ³ΠΎ пиксСля. Для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ этого ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ setAutoFillBackground(true). (По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Ρ„ΠΎΠ½ своСго Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°.)

Π’Ρ‹Π·ΠΎΠ² setSizePolicy() устанавливаСт ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ΠΏΠΎ ΠΎΠ±ΠΎΠΈΠΌ направлСниям Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ QSizePolicy::Expanding. Π­Ρ‚ΠΎ подсказываСт Π»ΡŽΠ±ΠΎΠΌΡƒ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ отвСтствСнСн Π·Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго склонСн ΠΊ росту, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΆΠΈΠΌΠ°Ρ‚ΡŒΡΡ. Вакая настройка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ‚ΠΈΠΏΠΈΡ‡Π½Π° для Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ мСста Π½Π° экранС. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² ΠΎΠ±ΠΎΠΈΡ… направлСниях устанавливаСтся ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° QSizePolicy::Preferred, ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰Π°Ρ, Ρ‡Ρ‚ΠΎ для Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π° основС Π΅Π³ΠΎ идСального Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, Π½ΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΆΠΈΠΌΠ°Ρ‚ΡŒΡΡ Π΄ΠΎ своСго минимального идСального Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈΠ»ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒΡΡ Π² Π»ΡŽΠ±Ρ‹Ρ… ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΏΡ€ΠΈ нСобходимости.

Π’Ρ‹Π·ΠΎΠ² setFocusPolicy(Qt::StrongFocus) заставляСт Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ фокус ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ клавиши табуляции Tab. Когда Plotter ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ фокус, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° события наТития клавиш. Π’ΠΈΠ΄ΠΆΠ΅Ρ‚ Plotter ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ нСсколько клавиш: Β«+Β» для увСличСния изобраТСния, Β«β€”Β» для ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ изобраТСния ΠΈ клавиш стрСлок для ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ Π²Π²Π΅Ρ€Ρ…, Π²Π½ΠΈΠ·, Π²Π»Π΅Π²ΠΎ ΠΈ Π²ΠΏΡ€Π°Π²ΠΎ.

Рис. 5.9. Π‘ΠΊΡ€ΠΎΠ»Π»ΠΈΠ½Π³ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Plotter.

Π’Π°ΠΊΠΆΠ΅ Π² конструкторС ΠΌΡ‹ создаСм Π΄Π²Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ QToolButtons, каТдая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΈΠΊΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Π­Ρ‚ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π΄Π°ΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ‚ΡŒ ΠΌΠ°ΡΡˆΡ‚Π°Π± изобраТСния. ΠŸΠΈΠΊΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΊΠ½ΠΎΠΏΠΎΠΊ хранятся Π² Ρ„Π°ΠΉΠ»Π΅ рСсурсов, поэтому любоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Plotter, Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку Π² Ρ„Π°ΠΉΠ»Π΅ .pro:

RESOURCES = plotter.qrc

Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΉΠ» рСсурсов ΠΏΠΎΡ…ΠΎΠΆ Π½Π° Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ использовали для прилоТСния ЭлСктронная Ρ‚Π°Π±Π»ΠΈΡ†Π°:

<!DOCTYPE RCC><RCC version="1.0">

<qresource>

<file>images/zoomin.png</file>

<file>images/zoomout.png</file>

</qresource>

</RCC>

Π’Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ adjustSize() ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ для ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΈΡ… ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹. Кнопки Π½Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ; вмСсто этого ΠΌΡ‹ Π·Π°Π΄Π°Π΅ΠΌ ΠΈΡ… ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ события измСнСния Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Plotter. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Π½Π΅ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Π½ΠΈΠΊΠ°ΠΊΠΈΠΌΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°ΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ явно Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ΠΊΠ½ΠΎΠΏΠΎΠΊ, пСрСдавая this конструктору QPushButton.

Π’Ρ‹Π·ΠΎΠ² Π² ΠΊΠΎΠ½Ρ†Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ setPlotSettings() Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ.

022 void Plotter::setPlotSettings(const PlotSettings &settings)

023 {

024 zoomStack.clear();

025 zoomStack.append(settings);

026 curZoom = 0;

027 zoomInButton->hide();

028 zoomOutButton->hide();

029 refreshPixmap();

030 }

Ѐункция setPlotSettings() устанавливаСт настройки PlotSettings для отобраТСния Π³Ρ€Π°Ρ„ΠΈΠΊΠ°. Π•Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ конструктор Plotter, ΠΈ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ класса. ΠŸΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒ ΠΊΡ€ΠΈΠ²Ρ‹Ρ… Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с принятого ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΌΠ°ΡΡˆΡ‚Π°Π±Π° изобраТСния. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, создаСтся Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр PlotSettings, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‚Π΅ΠΌ помСщаСтся Π² стСк ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΎΠ² изобраТСния. Π­Ρ‚ΠΎΡ‚ стСк ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΎΠ² ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ прСдставлСн двумя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈβ€”Ρ‡Π»Π΅Π½Π°ΠΌΠΈ:

β€’ zoomStack содСрТит настройки для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΎΠ² изобраТСния Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ QVector<PlotSettings>;

β€’ curZoom содСрТит индСкс Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ элСмСнта PlotSettings стСка zoomStack.

ПослС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ setPlotSettings() Π² стСкС ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΎΠ² ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ элСмСнт, Π° ΠΊΠ½ΠΎΠΏΠΊΠΈ Zoom In ΠΈ Zoom Out Π±ΡƒΠ΄ΡƒΡ‚ скрыты. Π­Ρ‚ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΈΠ΄Π½Ρ‹ Π½Π° экранС Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΌΡ‹ Π½Π΅ Π²Ρ‹Π·ΠΎΠ²Π΅ΠΌ для Π½ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ show() Π² слотах zoomIn() ΠΈ zoomOut(). (ΠžΠ±Ρ‹Ρ‡Π½ΠΎ для ΠΏΠΎΠΊΠ°Π·Π° всСх Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² достаточно Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ show() для Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня. Но ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ явным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ для Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ hide(), этот Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ скрыт Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° для Π½Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ show().)

Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ refreshPixmap() Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ для обновлСния изобраТСния Π½Π° экранС. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ update(), Π½ΠΎ здСсь ΠΌΡ‹ поступаСм Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΠΈΠΊΡΠ΅Π»ΡŒΠ½ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚Ρƒ QPixmap постоянно Π² ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΌ состоянии. ПослС Ρ€Π΅Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ пиксСльной ΠΊΠ°Ρ€Ρ‚Ρ‹ функция refreshPixmap() Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ update() для помСщСния пиксСльной ΠΊΠ°Ρ€Ρ‚Ρ‹ Π½Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚.

031 void Plotter::zoomOut()

032 {

033 if (curZoom > 0) {

034 --curZoom;

035 zoomOutButton->setEnabled(curZoom > 0);

036 zoomInButton->setEnabled(true);

037 zoomInButton->show();

038 refreshPixmap();

039 }

040 }

Π‘Π»ΠΎΡ‚ zoomOut() ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ ΠΌΠ°ΡΡˆΡ‚Π°Π± Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹, Ссли ΠΎΠ½Π° ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π° ΠΊΡ€ΡƒΠΏΠ½Ρ‹ΠΌ ΠΏΠ»Π°Π½ΠΎΠΌ. Он ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠ°ΡΡˆΡ‚Π°Π± изобраТСния ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΈΠ»ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΊΠ½ΠΎΠΏΠΊΡƒ ZoomOut, Π² зависимости ΠΎΡ‚ возмоТности дальнСйшСго ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹. Кнопка Zoom In Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΈ отобраТаСтся Π½Π° экранС, Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹ обновляСтся посрСдством Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ refreshPixmap().

041 void Plotter::zoomIn()

042 {

043 zoomInButton->setEnabled(curZoom< zoomStack.count() - 1);

044 if (curZoom < zoomStack.count() - 1) {

045 ++curZoom;

046 zoomOutButton->setEnabled(true);

047 zoomOutButton->show();

048 refreshPixmap();

049 }

050 }

Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ сначала ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ» ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π° Π·Π°Ρ‚Π΅ΠΌ вновь Π΅Π³ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ», настройки PlotSettings для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±Π° изобраТСния ΡƒΠΆΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ Π² стСкС ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΎΠ² изобраТСния, ΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ. (Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΌΠΎΠΆΠ½ΠΎ всС ΠΆΠ΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ€Π΅Π·ΠΈΠ½ΠΎΠ²ΠΎΠΉ Π»Π΅Π½Ρ‚Ρ‹.)

Π‘Π»ΠΎΡ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ curZoom для ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π½Π° ΠΎΠ΄ΠΈΠ½ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π²Π³Π»ΡƒΠ±ΡŒ стСка ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΎΠ² изобраТСния, Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΈΠ»ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΊΠ½ΠΎΠΏΠΊΡƒ Zoom In взависимости ΠΎΡ‚ возмоТности дальнСйшСго увСличСния изобраТСния ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ½ΠΎΠΏΠΊΡƒ Zoom Out. И вновь ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ refreshPixmap() для использования построитСлСм Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ² настроСк самого послСднСго ΠΌΠ°ΡΡˆΡ‚Π°Π±Π° изобраТСния.