Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: p222 от Июль 07, 2009, 10:39



Название: Нет перерисовки в цикле
Отправлено: 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);
    }
};
Как добиться перерисовки в цикле?


Название: Re: Нет перерисовки в цикле
Отправлено: kamre от Июль 07, 2009, 13:12
Как добиться перерисовки в цикле?

Использовать QTimer (http://doc.qtsoftware.com/latest/qtimer.html).


Название: Re: Нет перерисовки в цикле
Отправлено: p222 от Июль 08, 2009, 11:45
Цитировать
Использовать QTimer (http://doc.qtsoftware.com/latest/qtimer.html).


Ну вот, допустим, есть у меня поле 40х40. Мне нужно его промерить, перемещая датчик шаговыми двигателями, и одновременно выводить на экран положение датчика. Не представляю, как в данном случае использовать QTimer.


Название: Re: Нет перерисовки в цикле
Отправлено: BaltikS от Июль 08, 2009, 14:24
Что то я совсем не втыкаю, какое поле? Какой датчик? И причём тут Helper::msleep(5)?


Название: Re: Нет перерисовки в цикле
Отправлено: lit-uriy от Июль 08, 2009, 16:08
Внешний девайс работает во много раз медленее чем компьютер.
Можно с потоками, а можно и без потоков, например:
1) Посылаешь запрос/команду устройству
2) Получишь данные от девайса
3) пошли следующий запрос, а в это время рисуй
4) когда нарисуешь, проверь ответ от девайса, если есть, то на п.3


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

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


Название: Re: Нет перерисовки в цикле
Отправлено: lit-uriy от Июль 08, 2009, 18:35
>>Получения данных от девайса не предусмотрено.
>>К сожалению, я на этом запнулся. Можно ли реализовать это с помощью QTimer::singleShot?
тут совсем не понял.


Название: Re: Нет перерисовки в цикле
Отправлено: break от Июль 08, 2009, 18:37
Я вообще то тоже мало понял что надо но есть методы
QTest::qSleep
и
QTest::qWait - этот оставляет получение событий интерфейса и сети живыми - т.е. должно помочь возможно?

Вообще как то странно допустим возникло событие что надо переметсить девайс - отдаем команду в отрисовавающую форму, затем в сам девайс зачем слиипы и таймеры раз от девайса данные все равно не приходят?


Название: Re: Нет перерисовки в цикле
Отправлено: fuCtor от Июль 18, 2009, 21:46
Отрисовка произойдет когда до элемента дойдет сообщение о необходимости отрисовки. Поэтому после update() добавьте QAplication::processEvents().