Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Движение закрашенного квадрата по окружности
- //====================================================
- // main.cpp
- //====================================================
- #include <QApplication>
- #include "widgets.h"
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv); //осуществляет автоматический контроль и
- //управление приложением
- Widget w; //создаём окошко
- w.show(); //показываем окошко
- return a.exec(); //отвечает за взаимодействие с ОС
- }
- //====================================================
- //====================================================
- // square.h
- //====================================================
- #ifndef SQUARE_H
- #define SQUARE_H
- #include <QtGui>
- // Класс "точка"
- class Point
- {
- public:
- Point(int nx = 0,int ny = 0); //конструктор
- void show(QPainter* painter); //функция, отображающая точку
- protected:
- int x; //координаты точки
- int y;
- };
- //====================================================
- //Класс «полукруг»
- class MySquare : public Point // наследует Point
- {
- public:
- MySquare(int nx = 0, int ny = 0, int na = 40); //конструктор
- void show(QPainter *painter); //функция, рисующуая полукруг
- protected:
- int a; //сторона
- };
- #endif // SQUARE_H
- //====================================================
- // widgets.h
- //====================================================
- #ifndef WIDGETS_H
- #define WIDGETS_H
- #include <QWidget>
- #include "Square.h"
- //Этот класс - окно приложения
- //В нём осуществляется движение нашей фигуры
- class Widget : public QWidget //Наследует базовый класс библиотеки Qt
- {
- Q_OBJECT //Этот макрос указывает компилятору moc, что нужно внедрить в
- //файл дополнительную информацию, прежде чем передать его
- //стандартному компилятору С++
- public:
- Widget(QWidget *parent = 0);
- virtual void paintEvent(QPaintEvent *); //отвечает за рисование
- protected:
- virtual void timerEvent(QTimerEvent *); //отвечает за время
- private:
- QPainter painter; //"художник"
- //Переменные, необходимые для анимации:
- int time; //время
- int x, y; //координаты
- bool f; //флаги направления движения
- };
- #endif // WIDGETS_H
- //====================================================
- //square.cpp
- //====================================================
- #include "square.h"
- //====================================================
- Point::Point(int nx, int ny)
- {
- if ((nx > 0)&&(ny > 0))
- {
- x = nx;
- y = ny;
- }
- }
- //====================================================
- void Point::show(QPainter *painter)
- {
- painter->setPen(QPen(Qt::darkGreen,1)); //устанавливаем цвет и толщину
- // карандаша
- painter->drawPoint(QPoint(x,y)); //рисуем точку
- }
- //====================================================
- //====================================================
- MySquare::MySquare(int nx, int ny, int na)
- : Point(nx, ny)
- {
- if (na > 0) // если радиус не нулевой
- {
- a=na;
- }
- }
- //====================================================
- void MySquare::show(QPainter *painter)
- {
- painter->setPen(QPen(Qt::darkGreen,1)); //устанавливаем цвет и толщину
- //карандаша
- painter->setBrush(QBrush(Qt::darkGreen)); //устанавливаем цвет кисти
- painter->drawRect(x, y, a, a); //рисует квадрат
- }
- //====================================================
- //====================================================
- //widgets.cpp
- //====================================================
- #include "widgets.h"
- #define a1 40 //
- #define radius 200
- #define x_center 280
- #define y_center 280
- #define winow_w 600 // ширина окна
- #define winow_h 600 // высота окна
- //====================================================
- Widget::Widget(QWidget *parent)
- : QWidget(parent)
- {
- setFixedSize(winow_w, winow_h); // устанавливаем размер окна
- // программа работает и при произвольных размерах окна
- // но размер окна по умолчанию слишком большой
- // чтобы скриншоты для тестов получились красивыми
- // и не заняли слишком много места в отчёте
- // поэтому делаем окошко маленьким
- setWindowTitle("Lab SemiCircle"); //заголовок окна
- x = radius; // задаём начальные координаты
- y = y_center;
- f = true; // задаём начальное положение флагов
- startTimer(15); //запускаем таймер. Через каждые 15 мс вызывается
- // Widget::timerEvent()
- }
- //====================================================
- void Widget::paintEvent(QPaintEvent* event) // event служит для определения координат и размеров
- //конкретной области виджета, которую нужно перерисовать
- //так как у нас нет сложной графики,
- // то можно перерисовывать виджет полностью
- {
- QPainter painter(this); //художник
- painter.begin(this); //начинаем рисовать в окне
- if (f)
- {
- x++;
- y = y_center-sqrt(radius*radius-(x-x_center)*(x-x_center));
- }
- else
- {
- x--;
- y = y_center+sqrt(radius*radius-(x-x_center)*(x-x_center));
- }
- MySquare Sq(x,y,a1);
- Sq.show(&painter);
- painter.end();//освобождаем окно
- }
- //====================================================
- void Widget::timerEvent(QTimerEvent *event)
- {
- repaint(); //вызываем Widget::paintEvent()
- if (x>=x_center+radius || x<=x_center-radius && !f)
- f=!f;
- }
- //====================================================
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement