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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Нет перерисовки в цикле  (Прочитано 6770 раз)
p222
Гость
« : Июль 07, 2009, 10:39 »

Qt 4.5.0, XP/mingw. Произвожу перемещение элемента (линии) по кнопке:
Код:
void GrView::onMoveLeft()
{
    line=vline->line();
    if(line.x1()>0)
    {
        vline->setLine(line.x1()-10,line.y1(),line.x2()-10,line.y2());
    }
}
Перерисовка происходит нормально. Но, если делать это в цикле:
Код:
void GrView::MoveTo0()
{
    int i,cur_x,cur_y;
    cur_x=(int)(vline->line().x1());
    cur_y=(int)(hline->line().y1());
    for(i=cur_x;i>0;i--){onMoveLeft();Helper::msleep(5);}
    for(i=cur_y;i>0;i--){onMoveUp();Helper::msleep(5);}
}
то не происходит перерисовки, пока цикл не пройдет до конца. Пробовал вызывать repaint(), update(), но так ничего и не добился.
До protected QThread::msleep добрался так:
Код:
class Helper: public QThread {
public:
    static void msleep(int ms)
    {
        QThread::msleep(ms);
    }
};
Как добиться перерисовки в цикле?
Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #1 : Июль 07, 2009, 13:12 »

Как добиться перерисовки в цикле?

Использовать QTimer.
Записан
p222
Гость
« Ответ #2 : Июль 08, 2009, 11:45 »

Цитировать
Использовать QTimer.


Ну вот, допустим, есть у меня поле 40х40. Мне нужно его промерить, перемещая датчик шаговыми двигателями, и одновременно выводить на экран положение датчика. Не представляю, как в данном случае использовать QTimer.
« Последнее редактирование: Июль 08, 2009, 14:26 от p222 » Записан
BaltikS
Гость
« Ответ #3 : Июль 08, 2009, 14:24 »

Что то я совсем не втыкаю, какое поле? Какой датчик? И причём тут Helper::msleep(5)?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Июль 08, 2009, 16:08 »

Внешний девайс работает во много раз медленее чем компьютер.
Можно с потоками, а можно и без потоков, например:
1) Посылаешь запрос/команду устройству
2) Получишь данные от девайса
3) пошли следующий запрос, а в это время рисуй
4) когда нарисуешь, проверь ответ от девайса, если есть, то на п.3
Записан

Юра.
p222
Гость
« Ответ #5 : Июль 08, 2009, 17:15 »

Внешний девайс работает во много раз медленее чем компьютер.
Можно с потоками, а можно и без потоков, например:
1) Посылаешь запрос/команду устройству
2) Получишь данные от девайса
3) пошли следующий запрос, а в это время рисуй
4) когда нарисуешь, проверь ответ от девайса, если есть, то на п.3

Получения данных от девайса не предусмотрено.
К сожалению, я на этом запнулся. Можно ли реализовать это с помощью QTimer::singleShot? У меня пока не получилось. Не делать же, в самом деле, задержку так: for(i=0;i<100000000;i++)!  Улыбающийся
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Июль 08, 2009, 18:35 »

>>Получения данных от девайса не предусмотрено.
>>К сожалению, я на этом запнулся. Можно ли реализовать это с помощью QTimer::singleShot?
тут совсем не понял.
Записан

Юра.
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #7 : Июль 08, 2009, 18:37 »

Я вообще то тоже мало понял что надо но есть методы
QTest::qSleep
и
QTest::qWait - этот оставляет получение событий интерфейса и сети живыми - т.е. должно помочь возможно?

Вообще как то странно допустим возникло событие что надо переметсить девайс - отдаем команду в отрисовавающую форму, затем в сам девайс зачем слиипы и таймеры раз от девайса данные все равно не приходят?
« Последнее редактирование: Июль 08, 2009, 18:39 от break » Записан
fuCtor
Гость
« Ответ #8 : Июль 18, 2009, 21:46 »

Отрисовка произойдет когда до элемента дойдет сообщение о необходимости отрисовки. Поэтому после update() добавьте QAplication::processEvents().
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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