Кину код работы программы, может у кого будут идеи.
P.S. Там много мусора есть, еще не рефакторил код, поэтому просьба на это внимание не обращать, потом все сделаю. Сейчас пытаюсь решить эту проблему.
Таймер создается в классе Window, в котором создается GLWidget.
Window::Window()
{
setWindowTitle(tr("OpenGL"));
GLWidget *openGL = new GLWidget(&helper, this);
this->setFixedSize(300,300);
openGL->resize(this->width(),this->height());
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), openGL, SLOT(animate()));
timer->start(1);
}
Таймер связывается со слотом Animate, класса GLWidget и там же происходит paintEvent
void GLWidget::animate()
{
elapsed = (elapsed + qobject_cast<QTimer*>(sender())->interval()) % 10;
update();
}
void GLWidget::paintEvent(QPaintEvent *event)
{
QPainter painter;
painter.begin(this);
painter.setRenderHint(QPainter::Antialiasing);
helper->paint(&painter, event, elapsed);
painter.end();
}
В paintEvent вызывается функция paint, класса helper, в которой сначала рисуется прямоугольник заполняющий всю форму одним цветом. И следом рисуется или стирается шарик, в зависимости от того, нарисован ли он в данном случае.
void Helper::paint(QPainter *painter, QPaintEvent *event, int elapsed)
{
painter->fillRect(event->rect(), background);
QPen penRect(Qt::black);
penRect.setWidth(2);
painter->setPen(penRect);
painter->drawRect(GL_WINDOW_MIN_SIZE.x(),GL_WINDOW_MIN_SIZE.y(),GL_WINDOW_MAX_SIZE.x(),GL_WINDOW_MAX_SIZE.y());
painter->setViewport(0,0,300,300);
painter->save();
if (CheckPaint == 0)
{
painter->setBrush(circleBrush);
painter->setPen(circlePen);
painter->drawEllipse(CircleCoord.x(),CircleCoord.y(),
CircleSize.x(),CircleSize.y());
CheckPaint = 1;
}
else if (CheckPaint == 1)
{
painter->setBrush(clearCircleBrush);
painter->setPen(clearCirclePen);
painter->drawEllipse(CircleCoord.x(),CircleCoord.y(),
CircleSize.x(),CircleSize.y());
CheckPaint = 0;
ChangeCoord();
}
painter->restore();
}
Функция класса helper, которая отвечает за изменения следующих координат шарика:
void Helper::ChangeCoord()
{
CircleCoord.setX(CircleCoord.x()+CircleStep.x());
CircleCoord.setY(CircleCoord.y()+CircleStep.y());
if (CircleCoord.x() < GL_WINDOW_MIN_SIZE.x())
{
CircleStep.setX(-CircleStep.x());
CircleCoord.setX(GL_WINDOW_MIN_SIZE.x() - (CircleCoord.x() - GL_WINDOW_MIN_SIZE.x()));
}
if (CircleCoord.y() < GL_WINDOW_MIN_SIZE.y())
{
CircleStep.setY(-CircleStep.y());
CircleCoord.setY(GL_WINDOW_MIN_SIZE.y() - (CircleCoord.y() - GL_WINDOW_MIN_SIZE.y()));
}
int bufMaxX = GL_WINDOW_MAX_SIZE.x()-CircleSize.x();
int bufMaxY = GL_WINDOW_MAX_SIZE.y()-CircleSize.x();
if (CircleCoord.x() > bufMaxX)
{
CircleStep.setX(-CircleStep.x());
CircleCoord.setX(CircleCoord.x() - (CircleCoord.x()- bufMaxX ));
}
if (CircleCoord.y() > bufMaxY)
{
CircleStep.setY(-CircleStep.y());
CircleCoord.setY(CircleCoord.y() - (CircleCoord.y() - bufMaxY));
}
}