Russian Qt Forum

Qt => Вопросы новичков => Тема начата: qwyllum от Октябрь 13, 2013, 21:42



Название: qt движущиеся объекты
Отправлено: qwyllum от Октябрь 13, 2013, 21:42
Доброго времени суток! С-но возник вопрос как в qt сделать движущиеся объекты.

Поскольку опыта в этой теме у меня нет и гугление по теме ничего не дало(может гуглить не умею), то решил для начала поставить элипс в рандомных координатах в paintEvent и обновлять постоянно с помощью repaint. Qt начал ругаться на рекурсию и тогда добавил таймер. Теперь это выглядит вроде:

Код:
    QPainter *p=new QPainter(this);
    QTimer *timer = new QTimer(this);
         connect(timer, SIGNAL(timeout()), this, SLOT(repaint()));
         timer->start(30);

    int x=rand()%400;
    int y=rand()%400;
    p->drawEllipse(x,y,200,200);

    p->end();

    delete p;
    delete timer;

Но я понимаю, что этот способ неправильный, хотя-бы потому, что окно перестало реагировать на нажатие,а это уже не есть круто. Хотелось бы пинка в нужную сторону. По задаче мне необходимо сделать несколько движущихся кругов, отскакивающих от границ экрана. Заранее премного благодарен!


Название: Re: qt движущиеся объекты
Отправлено: mutineer от Октябрь 13, 2013, 22:14
Ты взводишь таймер и тут же его удаляешь? оригинально...


Название: Re: qt движущиеся объекты
Отправлено: qwyllum от Октябрь 13, 2013, 22:35
Ты взводишь таймер и тут же его удаляешь? оригинально...
убрал удаление таймера, ничего кардинально не изменилось...


Название: Re: qt движущиеся объекты
Отправлено: qwyllum от Октябрь 13, 2013, 22:53
Окей, перефразирую вопрос. В общем без привязки к конкретной библиотеке я вижу цикл своей программы так:

do
{
очистка экрана

получение действия пользователя
если пользователь нажал кл. Esc - выход

отрисовка объектов

}while(1)

я не понимаю как реализовать чтобы цикл отрисовки постоянно обновлялся для отрисовки движущихся объектов


Название: Re: qt движущиеся объекты
Отправлено: mutineer от Октябрь 13, 2013, 23:09
Заведи таймер с небольшим интервалом и вызывай перерисовку по его таймауту. Действия пользователя придут через ивенты между срабатываниями таймера


Название: Re: qt движущиеся объекты
Отправлено: qwyllum от Октябрь 13, 2013, 23:12
Заведи таймер с небольшим интервалом и вызывай перерисовку по его таймауту. Действия пользователя придут через ивенты между срабатываниями таймера
А куда мне всунуть таймер? Я его потому и всовывал в цикл paintEvent что он бесконечный и перерисовка будет повторятся. Если я вставлю таймер, например, в конструктор, он один раз сработает и все.


Название: Re: qt движущиеся объекты
Отправлено: mutineer от Октябрь 13, 2013, 23:14
http://doc.qt.digia.com/4.7/qtimer.html#singleShot-prop


Название: Re: qt движущиеся объекты
Отправлено: qwyllum от Октябрь 14, 2013, 00:37
http://doc.qt.digia.com/4.7/qtimer.html#singleShot-prop
Огромное спасибо, все встало на свои места