Russian Qt Forum
Ноябрь 26, 2024, 19:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: qt движущиеся объекты  (Прочитано 5064 раз)
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;

Но я понимаю, что этот способ неправильный, хотя-бы потому, что окно перестало реагировать на нажатие,а это уже не есть круто. Хотелось бы пинка в нужную сторону. По задаче мне необходимо сделать несколько движущихся кругов, отскакивающих от границ экрана. Заранее премного благодарен!
Записан
mutineer
Гость
« Ответ #1 : Октябрь 13, 2013, 22:14 »

Ты взводишь таймер и тут же его удаляешь? оригинально...
Записан
qwyllum
Гость
« Ответ #2 : Октябрь 13, 2013, 22:35 »

Ты взводишь таймер и тут же его удаляешь? оригинально...
убрал удаление таймера, ничего кардинально не изменилось...
Записан
qwyllum
Гость
« Ответ #3 : Октябрь 13, 2013, 22:53 »

Окей, перефразирую вопрос. В общем без привязки к конкретной библиотеке я вижу цикл своей программы так:

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

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

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

}while(1)

я не понимаю как реализовать чтобы цикл отрисовки постоянно обновлялся для отрисовки движущихся объектов
Записан
mutineer
Гость
« Ответ #4 : Октябрь 13, 2013, 23:09 »

Заведи таймер с небольшим интервалом и вызывай перерисовку по его таймауту. Действия пользователя придут через ивенты между срабатываниями таймера
Записан
qwyllum
Гость
« Ответ #5 : Октябрь 13, 2013, 23:12 »

Заведи таймер с небольшим интервалом и вызывай перерисовку по его таймауту. Действия пользователя придут через ивенты между срабатываниями таймера
А куда мне всунуть таймер? Я его потому и всовывал в цикл paintEvent что он бесконечный и перерисовка будет повторятся. Если я вставлю таймер, например, в конструктор, он один раз сработает и все.
Записан
mutineer
Гость
« Ответ #6 : Октябрь 13, 2013, 23:14 »

http://doc.qt.digia.com/4.7/qtimer.html#singleShot-prop
Записан
qwyllum
Гость
« Ответ #7 : Октябрь 14, 2013, 00:37 »

Огромное спасибо, все встало на свои места
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.109 секунд. Запросов: 21.