Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: blood_shadow от Март 17, 2011, 14:14



Название: scroll(-1, 0) и paintEvent()
Отправлено: blood_shadow от Март 17, 2011, 14:14
Добрый день,
разбираю пример с бегущей строкой ticker(пример идет вместе с книгой):
есть текст "How long it lasted was impossible to say ++ ", который движется справо на лево
благодаря 30 милисек. таймеру
Код
C++ (Qt)
void Ticker::timerEvent(QTimerEvent *event)
{
   if (event->timerId() == myTimerId) {
       ++offset;
       if (offset >= fontMetrics().width(text()))
           offset = 0;
       update(); //scroll(-1, 0);
   } else {
       QWidget::timerEvent(event);
   }
}
 
каждые 30 милисекунд вызываеться пеинт ивент(с помощью ф-ции update()):
Код
C++ (Qt)
void Ticker::paintEvent(QPaintEvent * /* event */)
{
   QPainter painter(this);
 
   int textWidth = fontMetrics().width(text());
   if (textWidth < 1)
       return;
   int x = -offset;
   while (x < width()) {
       painter.drawText(x, 0, textWidth, height(),
                        Qt::AlignLeft | Qt::AlignVCenter, text());
       x += textWidth;
   }
}
 

тут собственно все понятно текст который не попадает в пределы виджета просто игнорируется
но в книге написано что если заменить update() на scroll(-1, 0); то текст просто будет
здвигаться на 1 пиксель влево, а перерисовываться будет только один пиксель который появился
справа, то есть scroll(-1, 0) вызывает еще update ( const QRegion & rgn ), но откуда painter знает
что надо только обновить самый последний пиксель, ведь я игнорирую QRegion & rgn в сигнатуре
ф-ции paintEvent(QPaintEvent * /* event */) ?