Advertisement
Domerk

Объекты_Дима

Dec 11th, 2013
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Движение закрашенного квадрата по окружности
  2.  
  3. //====================================================
  4. // main.cpp
  5. //====================================================
  6.  
  7. #include <QApplication>
  8. #include "widgets.h"
  9.  
  10. int main(int argc, char *argv[])
  11. {
  12.     QApplication a(argc, argv); //осуществляет автоматический контроль и
  13.                                  //управление приложением
  14.     Widget w; //создаём окошко
  15.     w.show(); //показываем окошко
  16.  
  17.     return a.exec(); //отвечает за взаимодействие с ОС
  18. }
  19.  
  20. //====================================================
  21.  
  22. //====================================================
  23. // square.h
  24. //====================================================
  25.  
  26. #ifndef SQUARE_H
  27. #define SQUARE_H
  28.  
  29. #include <QtGui>
  30.  
  31. // Класс "точка"
  32. class Point
  33. {
  34. public:
  35.     Point(int nx = 0,int ny = 0); //конструктор
  36.     void show(QPainter* painter); //функция, отображающая точку
  37. protected:
  38.     int x; //координаты точки
  39.     int y;
  40. };
  41.  
  42. //====================================================
  43.  
  44. //Класс «полукруг»
  45. class MySquare : public Point //  наследует Point
  46. {
  47. public:
  48.     MySquare(int nx = 0, int ny = 0, int na = 40); //конструктор
  49.     void show(QPainter *painter); //функция, рисующуая полукруг
  50. protected:
  51.     int a; //сторона
  52. };
  53.  
  54. #endif // SQUARE_H
  55.  
  56. //====================================================
  57. // widgets.h
  58. //====================================================
  59.  
  60. #ifndef WIDGETS_H
  61. #define WIDGETS_H
  62.  
  63. #include <QWidget>
  64. #include "Square.h"
  65.  
  66. //Этот класс - окно приложения
  67. //В нём осуществляется движение нашей фигуры
  68.  
  69. class Widget : public QWidget //Наследует базовый класс библиотеки Qt
  70. {
  71.     Q_OBJECT //Этот макрос указывает компилятору moc, что нужно внедрить в
  72.              //файл дополнительную информацию, прежде чем передать его
  73.              //стандартному компилятору С++
  74.  
  75. public:
  76.     Widget(QWidget *parent = 0);
  77.     virtual void paintEvent(QPaintEvent *); //отвечает за рисование
  78. protected:
  79.     virtual void timerEvent(QTimerEvent *); //отвечает за время
  80.  
  81. private:
  82.     QPainter painter; //"художник"
  83.     //Переменные, необходимые для анимации:
  84.     int time; //время
  85.     int x, y; //координаты
  86.     bool f; //флаги направления движения
  87. };
  88.  
  89.  
  90. #endif // WIDGETS_H
  91.  
  92. //====================================================
  93. //square.cpp
  94. //====================================================
  95.  
  96. #include "square.h"
  97.  
  98. //====================================================
  99.  
  100. Point::Point(int nx, int ny)
  101. {
  102.     if ((nx > 0)&&(ny > 0))
  103.     {
  104.         x = nx;
  105.         y = ny;
  106.     }
  107. }
  108.  
  109. //====================================================
  110.  
  111. void Point::show(QPainter *painter)
  112. {
  113.     painter->setPen(QPen(Qt::darkGreen,1)); //устанавливаем цвет и толщину
  114.                                             // карандаша
  115.     painter->drawPoint(QPoint(x,y)); //рисуем точку
  116. }
  117.  
  118. //====================================================
  119.  
  120. //====================================================
  121.  
  122. MySquare::MySquare(int nx, int ny, int na)
  123.     : Point(nx, ny)
  124. {
  125.     if (na > 0) // если радиус не нулевой
  126.     {
  127.         a=na;
  128.     }
  129. }
  130.  
  131. //====================================================
  132.  
  133. void MySquare::show(QPainter *painter)
  134. {
  135.     painter->setPen(QPen(Qt::darkGreen,1)); //устанавливаем цвет и толщину
  136.                                             //карандаша
  137.     painter->setBrush(QBrush(Qt::darkGreen)); //устанавливаем цвет кисти
  138.     painter->drawRect(x, y, a, a); //рисует квадрат
  139.  
  140. }
  141.  
  142. //====================================================
  143.  
  144. //====================================================
  145. //widgets.cpp
  146. //====================================================
  147.  
  148. #include "widgets.h"
  149.  
  150. #define a1 40  //
  151. #define radius 200
  152. #define x_center 280
  153. #define y_center 280
  154. #define winow_w 600 // ширина окна
  155. #define winow_h 600 // высота окна
  156.  
  157. //====================================================
  158.  
  159. Widget::Widget(QWidget *parent)
  160.     : QWidget(parent)
  161. {
  162.    setFixedSize(winow_w, winow_h); // устанавливаем размер окна
  163.     // программа работает и при произвольных размерах окна
  164.     // но размер окна по умолчанию слишком большой
  165.     // чтобы скриншоты для тестов получились красивыми
  166.     // и не заняли слишком много места в отчёте
  167.     // поэтому делаем окошко маленьким
  168.  
  169.     setWindowTitle("Lab SemiCircle"); //заголовок окна
  170.     x = radius; // задаём начальные координаты
  171.     y = y_center;
  172.     f = true; // задаём начальное положение флагов
  173.     startTimer(15); //запускаем таймер. Через каждые 15 мс вызывается
  174.                     // Widget::timerEvent()
  175.  
  176. }
  177.  
  178. //====================================================
  179.  
  180. void Widget::paintEvent(QPaintEvent* event) // event служит для определения координат и размеров
  181.                                             //конкретной области виджета, которую нужно перерисовать
  182.                                             //так как у нас нет сложной графики,
  183.                                             // то можно перерисовывать виджет полностью
  184. {
  185.     QPainter painter(this); //художник
  186.     painter.begin(this); //начинаем рисовать в окне
  187.  
  188.  
  189.     if (f)
  190.     {
  191.         x++;
  192.         y = y_center-sqrt(radius*radius-(x-x_center)*(x-x_center));
  193.     }
  194.     else
  195.     {
  196.         x--;
  197.         y = y_center+sqrt(radius*radius-(x-x_center)*(x-x_center));
  198.     }
  199.  
  200.  
  201.  
  202.  
  203.     MySquare Sq(x,y,a1);
  204.     Sq.show(&painter);
  205.     painter.end();//освобождаем окно
  206. }
  207.  
  208. //====================================================
  209.  
  210. void Widget::timerEvent(QTimerEvent *event)
  211. {
  212.     repaint(); //вызываем Widget::paintEvent()
  213.  
  214.     if (x>=x_center+radius || x<=x_center-radius && !f)
  215.         f=!f;
  216.  
  217. }
  218.  
  219. //====================================================
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement