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

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

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

01 class OvenTimer : public QWidget

02 {

03 Q_OBJECT

04 public:

05 OvenTimer(QWidget *parent = 0);

06 void setDuration(int secs);

07 int duration() const;

08 void draw(QPainter *painter);

09 signals:

10 void timeout();

11 protected:

12 void paintEvent(QPaintEvent *event);

13 void mousePressEvent(QMouseEvent *event);

14 private:

15 QDateTime finishTime;

16 QTimer *updateTimer;

17 QTimer *finishTimer;

18 }

Класс OvenTimer наслСдуСт QWidget ΠΈ пСрСопрСдСляСт Π΄Π²Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: paintEvent() ΠΈ mousePressEvent().

const double DegreesPerMinute = 7.0;

const double DegreesPerSecond = DegreesPerMinute / 60;

const int MaxMinutes = 45;

const int MaxSeconds = MaxMinutes * 60;

const int UpdateInterval = 1;

ΠœΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ с Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… констант, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… внСшним Π²ΠΈΠ΄ΠΎΠΌ ΠΈ Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° Π΄ΡƒΡ…ΠΎΠ²ΠΊΠΈ.

01 OvenTimer::OvenTimer(QWidget *parent)

02 : QWidget(parent)

03 {

04 finishTime = QDateTime::currentDateTime();

05 updateTimer = new QTimer(this);

06 connect(updateTimer, SIGNAL(timeouf()),

07 this, SLOT(update()));

08 finishTimer = new QTimer(this);

09 finishTimer->setSingleShot(true);

10 connect(finishTimer, SIGNAL(timeout()),

11 this, SIGNAL(timeout()));

12 connect(finishTimer, SIGNAL(timeout()),

13 updateTimer, SLOT(stop()));

14 }

Π’ конструкторС ΠΌΡ‹ создаСм Π΄Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° QTimer: updateTimer ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для обновлСния внСшнСго Π²ΠΈΠ΄Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°ΠΆΠ΄ΡƒΡŽ сСкунду, a finishTimer Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ сигнал Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° timeout() ΠΏΡ€ΠΈ достиТСнии ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΠΈ 0. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ finishTimer Π΄ΠΎΠ»ΠΆΠ΅Π½ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ сигнал Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π°, поэтому ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ setSingleShot(true); ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρ‹ Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ, ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΈ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ остановлСны ΠΈΠ»ΠΈ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½Ρ‹. ПослСдний Π²Ρ‹Π·ΠΎΠ² connect() являСтся ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ ΠΈ обСспСчиваСт ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ обновлСния Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ΠΊΠ°ΠΆΠ΄ΡƒΡŽ сСкунду, ΠΊΠΎΠ³Π΄Π° Ρ‚Π°ΠΉΠΌΠ΅Ρ€ Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π΅Π½.

01 void OvenTimer::setDuration(int secs)

02 {

03 if (secs > MaxSeconds) {

04 secs = MaxSeconds;

05 } else if (secs <= 0) {

06 secs = 0;

07 }

08 finishTime = QDateTime::currentDateTime().addSecs(secs);

09 if (secs > 0) {

10 updateTimer->start(UpdateInterval * 1000);

11 finishTimer->start(secs * 1000);

12 } else {

13 updateTimer->stop();

14 finishTimer->stop();

15 }

16 update();

17 }

Ѐункция setDuration() выставляСт Ρ‚Π°ΠΉΠΌΠ΅Ρ€ Π΄ΡƒΡ…ΠΎΠ²ΠΊΠΈ, задавая Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ количСство сСкунд. ВрСмя окончания ΠΌΡ‹ рассчитываСм ΠΏΡƒΡ‚Π΅ΠΌ добавлСния ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΌΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ QDateTime::currentDateTime(), ΠΈ сохраняСм Π΅Π³ΠΎ Π² Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ finishTime. B ΠΊΠΎΠ½Ρ†Π΅ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ update() для пСрСрисовки Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° с Π½ΠΎΠ²ΠΎΠΉ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρ‹.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ finishTime ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ QDateTime. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° содСрТит Π΄Π°Ρ‚Ρƒ ΠΈ врСмя, ΠΌΡ‹ ΠΈΠ·Π±Π΅Π³Π°Π΅ΠΌ ошибки ΠΈΠ·-Π·Π° смСны суток, ΠΊΠΎΠ³Π΄Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя оказываСтся Π΄ΠΎ ΠΏΠΎΠ»ΡƒΠ½ΠΎΡ‡ΠΈ, Π° врСмя окончания β€” послС ΠΏΠΎΠ»ΡƒΠ½ΠΎΡ‡ΠΈ.

01 int OvenTimer::duration() const

02 {

03 int secs = QDateTime::currentDateTime().

04 secsTo(finishTime);

05 if (secs < 0)

06 secs = 0;

07 return secs;

08 }

Ѐункция duration() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство сСкунд, ΠΎΡΡ‚Π°Π²ΡˆΠ΅Π΅ΡΡ Π΄ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°. Если Ρ‚Π°ΠΉΠΌΠ΅Ρ€ Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π΅Π½, ΠΌΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ 0.

01 void OvenTimer::mousePressEvent(QMouseEvent *event)

02 {

03 QPointF point = event->pos() - rect().center();

04 double theta = atan2(-point.x(), -point.y()) * 180 / 3.14159265359;

05 setDuration(duration() + int(theta / DegreesPerSecond));

06 update();

07 }

Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Ρ‰Π΅Π»ΠΊΠ°Π΅Ρ‚ ΠΏΠΎ этому Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρƒ, ΠΌΡ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ Π±Π»ΠΈΠΆΠ°ΠΉΡˆΡƒΡŽ ΠΌΠ΅Ρ‚ΠΊΡƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚ΠΎΠ½ΠΊΡƒΡŽ, Π½ΠΎ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρƒ, Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈΠ΄Π΅Ρ‚ Π½Π° установку Π½ΠΎΠ²ΠΎΠΉ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ событиС пСрСрисовки. ΠœΠ΅Ρ‚ΠΊΠ°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ‰Π΅Π»ΠΊΠ½ΡƒΠ» ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ свСрху ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π½ΠΎΠ³ΠΎ диска ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΡ‚ΠΈΠ² часовой стрСлки Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ достигнуто Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0.

01 void OvenTimer::paintEvent(QPaintEvent * /* event */)

02 {

03 QPainter painter(this);

04 painter.setRenderHint(QPainter::Antialiasing, true);

05 int side = qMin(width(), height());

06 painter.setViewport((width() - side) / 2, (height() - side) / 2,

07 side, side);

08 painter.setWindow(-50, -50, 100, 100);

09 draw(&painter);

10 }

B paintEvent() ΠΌΡ‹ устанавливаСм ΠΎΠ±Π»Π°ΡΡ‚ΡŒ отобраТСния Π½Π° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°, ΠΈ ΠΌΡ‹ устанавливаСм ΠΎΠΊΠ½ΠΎ Π½Π° ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ (β€”50, β€”50, 100, 100), Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π½Π° ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ с Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌΠΈ 100 Γ— 100, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ пространство ΠΎΡ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ (β€”50, β€”50) Π΄ΠΎ Ρ‚ΠΎΡ‡ΠΊΠΈ (+50, +50). Шаблонная функция qMin Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ наимСньшСС ΠΈΠ· Π΄Π²ΡƒΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ draw() для фактичСского Π²Ρ‹Π²ΠΎΠ΄Π° рисунка Π½Π° экран.

Рис. 8.10. Π’ΠΈΠ΄ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° OvenTimer ΠΏΡ€ΠΈ Ρ‚Ρ€Π΅Ρ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€Π°Ρ….

Если ΠΎΠ±Π»Π°ΡΡ‚ΡŒ отобраТСния Π½Π΅ Π±Ρ‹Π»Π° Π±Ρ‹ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠΌ, Ρ‚Π°ΠΉΠΌΠ΅Ρ€ Π΄ΡƒΡ…ΠΎΠ²ΠΊΠΈ принял Π±Ρ‹ Ρ„ΠΎΡ€ΠΌΡƒ эллипса, ΠΊΠΎΠ³Π΄Π° Ρ„ΠΎΡ€ΠΌΠ° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° пСрСстанСт Π±Ρ‹Ρ‚ΡŒ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΠΎΠΉ послС измСнСния Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ². Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ Π΄Π΅Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ отобраТСния ΠΈ ΠΎΠΊΠ½ΠΎ Π½Π° ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ΠΌ сторон.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ рисования:

01 void OvenTimer::draw(QPainter *painter)

02 {

03 static const int triangle[3][2] = {

04 { -2, -49 }, { +2, -49 }, { 0, -47 }

05 };

10 QPen thickPen(palette().foreground(), 1.5);

11 QPen thinPen(palette().foreground(), 0.5);

12 QColor niceBlue(150, 150, 200);

13 painter->setPen(thinPen);

14 painter->setBrush(palette().foreground());

15 painter->drawPolygon(QPolygon(3, &triangle[0][0]));

ΠœΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ с отобраТСния малСнького Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 0 Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ части Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°. Π­Ρ‚ΠΎΡ‚ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ задаСтся Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ трСмя фиксированными ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ, ΠΈ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ drawPolygon() для Π΅Π³ΠΎ воспроизвСдСния.

Одно ΠΈΠ· удобств примСнСния ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Β«ΠΎΠΊΠ½ΠΎβ€”ΠΎΠ±Π»Π°ΡΡ‚ΡŒ отобраТСния» Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ… рисования ТСстко Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΈ Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π΄ΠΎΠ±ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ измСнСния Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ².

16 QConicalGradient coneGradient(0, 0, -90.0);

17 coneGradient.setColorAt(0.0, Qt::darkGray);

18 coneGradient.setColorAt(0.2, niceBlue);

19 coneGradient.setColorAt(0.5, Qt::white);

20 coneGradient.setColorAt(1.0, Qt::darkGray);

21 painter->setBrush(coneGradient);

22 painter->drawEllipse(-46, -46, 92, 92);

ΠœΡ‹ рисуСм внСшнюю ΠΎΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈ заполняСм Π΅Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ коничСский Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚. Π¦Π΅Π½Ρ‚Ρ€ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π° находится Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ (0, 0), Π° Π΅Π³ΠΎ ΡƒΠ³ΠΎΠ» Ρ€Π°Π²Π΅Π½ β€”90Β°.

23 QRadialGradient haloGradient(0, 0, 20, 0, 0);

24 haloGradient.setColorAt(0.0, Qt::lightGray);

25 haloGradient.setColorAt(0.8, Qt::darkGray);

26 haloGradient.setColorAt(0.9, Qt::white);

27 haloGradient.setColorAt(1.0, Qt::black);

28 painter->setPen(Qt::NoPen);

29 painter->setBrush(haloGradient);

30 painter->drawEllipse(-20, -20, 40, 40);

ΠœΡ‹ заполняСм Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ ΠΎΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ€Π°Π΄ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚. Π¦Π΅Π½Ρ‚Ρ€ ΠΈ фокус Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π° Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ (0, 0). Радиус Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π° Ρ€Π°Π²Π΅Π½ 20.

31 QLinearGradient knobGradient(-7, -25, 7, -25);

32 knobGradient.setColorAt(0.0, Qt::black);

33 knobGradient.setColorAt(0.2, niceBlue);

34 knobGradient.setColorAt(0.3, Qt::lightGray);

35 knobGradient.setColorAt(0.8, Qt::white);

36 knobGradient.setColorAt(1.0, Qt::black);


37 painter->rotate(duration() * DegreesPerSecond);

38 painter->setBrush(knobGradient);

39 painter->setPen(thinPen);

40 painter->drawRoundRect(-7, -25, 14, 50, 150, 50);


41 for (int i = 0; i <= MaxMinutes; ++i) {

42 if (i % 5 == 0) {

43 painter->setPen(thickPen);

44 painter->drawLine(0, -41, 0, -44);

45 painter->drawText(-15, -41, 30, 25,

46 Qt::AlignHCenter | Qt::AlignTop,

47 QString::number(i));

48 } else {

49 painter->setPen(thinPen);

50 painter->drawLine(0, -42, 0, -44);

51 }

52 painter->rotate(-DegreesPerMinute);

53 }

54 }

ΠœΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ rotate() для ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π° систСмы ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ Ρ€ΠΈΡΠΎΠ²Π°Π»ΡŒΡ‰ΠΈΠΊΠ°. Π’ старой систСмС ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ нулСвая ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΠ° Π½Π°Ρ…ΠΎΠ΄ΠΈΠ»Π°ΡΡŒ свСрху; Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ нулСвая ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΠ° пСрСмСщаСтся для установки ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ остаСтся Π΄ΠΎ срабатывания Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°. ПослС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π° ΠΌΡ‹ снова рисуСм Ρ€ΡƒΡ‡ΠΊΡƒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΅Π³ΠΎ ориСнтация зависит ΠΎΡ‚ ΡƒΠ³Π»Π° ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π°.

Π’ Ρ†ΠΈΠΊΠ»Π΅ for ΠΌΡ‹ рисуСм ΠΌΠΈΠ½ΡƒΡ‚Π½Ρ‹Π΅ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΏΠΎ внСшнСй окруТности ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ количСство ΠΌΠΈΠ½ΡƒΡ‚ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 5 ΠΌΠΈΠ½ΡƒΡ‚Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠΊ. ВСкст размСщаСтся Π² Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΠΎΠΌ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ΅ ΠΏΠΎΠ΄ ΠΌΠΈΠ½ΡƒΡ‚Π½ΠΎΠΉ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π° ΠΌΡ‹ ΠΏΠΎΠ²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ Ρ€ΠΈΡΠΎΠ²Π°Π»ΡŒΡ‰ΠΈΠΊ ΠΏΠΎ часовой стрСлкС Π½Π° 7Β°, Ρ‡Ρ‚ΠΎ соотвСтствуСт ΠΎΠ΄Π½ΠΎΠΉ ΠΌΠΈΠ½ΡƒΡ‚Π΅. ΠŸΡ€ΠΈ рисовании ΠΌΠΈΠ½ΡƒΡ‚Π½ΠΎΠΉ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π· ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ мСстС окруТности, хотя ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ функциям drawLine() ΠΈ drawText().