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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: анимация на нескольких окнах  (Прочитано 4694 раз)
muaddib1981@mail.ru
Гость
« : Ноябрь 10, 2009, 11:31 »

есть такая проблема есть 3 окна: QMainWindow *wnd1,*wnd2,*wnd3;

В wnd2 рисуется анимация посредством вызовов команд из wnd1 и затем wnd2->repaint()  и Sleep(n).
В wnd3 по QTimer мерцает рамка каждые 100 мс, вернее должна была мерцать потому как Sleep ей мешает.

Мне надо чтобы в окне wnd2 была анимация и в wnd3 мерцала рамка и все это одновременно.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #1 : Ноябрь 11, 2009, 03:13 »

я понял так: в wnd1 мы что-то меняем - соответственно этому что-то меняется в wnd2 а в wnd3 всегда само по себе что-то мерцает - если так то зачем вообще sleep?
Записан
muaddib1981@mail.ru
Гость
« Ответ #2 : Ноябрь 11, 2009, 08:26 »

sleep нужен чтобы анимация в wnd2 происходила не слишком быстро.
Записан
manarch
Гость
« Ответ #3 : Ноябрь 11, 2009, 08:39 »

есть такая проблема есть 3 окна: QMainWindow *wnd1,*wnd2,*wnd3;

В wnd2 рисуется анимация посредством вызовов команд из wnd1 и затем wnd2->repaint()  и Sleep(n).
В wnd3 по QTimer мерцает рамка каждые 100 мс, вернее должна была мерцать потому как Sleep ей мешает.

Мне надо чтобы в окне wnd2 была анимация и в wnd3 мерцала рамка и все это одновременно.

а зачем Sleep? В wnd1 создал сигнал а в wnd2 слот анимации. В слоте wnd2 выполняеш шаг анимации и запускаеш таймер если он еще не был запущен. В слоте таймера снова вызываеш слот анимации, который выполнит сл.шаг и перезапустит таймер. Можеш еще добавить сигнал и слот для остановки анимации.
кстати в wnd3 ты фактически делаеш тоже самое использую QTimer.
После создания окон соединяеш сингалы и слоты запуска и остановки анимации и поехал ...
Записан
muaddib1981@mail.ru
Гость
« Ответ #4 : Ноябрь 12, 2009, 10:35 »

не получится, так как я не знаю в wnd1 когда закончится передвижение объекта (когда закончится timer), а мне надо объект дальше двигать. Если сделать простой цикл опроса таймера в wnd1, то программа зациклится, предполагаю потому, что wnd1 и wnd2 работают в одном процессе, и чтобы передать управление wnd2 нужно закончить функцию в wnd1.
Записан
muaddib1981@mail.ru
Гость
« Ответ #5 : Ноябрь 12, 2009, 10:38 »

Цитировать
В слоте таймера снова вызываеш слот анимации, который выполнит сл.шаг и перезапустит таймер.

wnd2 - не знает куда и когда надо двигатся, поэтому все команды должны идти из wnd1

Записан
muaddib1981@mail.ru
Гость
« Ответ #6 : Ноябрь 12, 2009, 10:47 »

Код:
#include "wnd2.h"
#include "wnd3.h"


class CWnd1:public QMainWindow
{
    public:
      CWnd1(void);     

    private:
       CWnd2 *wnd2;
       CWnd3 *wnd3;

       void func1(void);

};

CWnd1::CWnd1(void)
{
     wnd2=new CWnd2();
     wnd3=new CWnd3();
     wnd2->show();
     wnd3->show();
};

void CWnd1::func1(void)
{
     wnd2->pos(1,5);
     wnd2->repaint();
     Sleep(100);
     wnd2->pos(6,2);
     wnd2->repaint();
     Sleep(100);
     wnd2->pos(7,1);
     wnd->repaint();
     ...
};
Записан
manarch
Гость
« Ответ #7 : Ноябрь 13, 2009, 07:19 »

Цитировать
wnd2 - не знает куда и когда надо двигатся, поэтому все команды должны идти из wnd1

Не понимаю к чем загвоздка то? передаеш в wnd2 в слоте параметры перемещения (направление, координаты точки назначения, скорость и тд.). он выполняет по ОДНОМУ шагу за один тик таймера, после чего передает управление ядру Qt который выполняет отработку перерисовки всех объектов, сообщение и т.д. Пока wnd2 выполняет отрисовку wnd1 может делать свои дела и ждать пока wnd2 полностью выполнит команду. После того как wnd2 отработает весь цикл перемещения он может информировать wnd1 об окончании перемещения через сигнал. Получив информацию об окончании перемещения wnd1 подготовит следующую команду перемещения.
И еще в Qt есть одно жесткое условие что обработка GUI должна производиться ТОЛЬКО в одном процессе, причем по большей части в главном. Поэтому изначально закладывай в постоение слотов и сигналов невозможность кругового вызова.
Счас немного посижу и напишу пример по анимации нескольких виджетов.

Вот тебе анимация... марцающее окно в принципе сам сможеш добавить. Если я анимировал не совсем так как тебе надо напиши.
« Последнее редактирование: Ноябрь 13, 2009, 09:35 от manarch » Записан
_govorilka
Гость
« Ответ #8 : Ноябрь 13, 2009, 20:55 »

На сколько я понимаю sleep() останавливает текущий поток на какое-то время... В Qt все окна живут в одном потоке. В вашем случае получается, что функция sleep() останавливается работу всей программы.
Сделайте анимацию через QTimer (это самое простое решение) как предложили выше, вместо того чтобы хранить указатели на другие окна, организуйте систему сигналов и слотов и жить станет проще.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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