2015-08-10 3 views
1

У меня есть несколько свойств, которые имеют обработчики изменений, которые запрашивают перерисовку холста. Это работает довольно хорошо, но я хотел бы отказаться от сигнала, потому что пользователь может видеть только ограниченное количество обновлений, а некоторые элементы данных могут меняться довольно часто. Это приводит к гораздо большему обновлению, чем пользователь может видеть и уменьшает гибкость пользовательского интерфейса.Как отбить сигнал в QML?

Я рассмотрел debouncing сигнал в javascript (есть примеры в Интернете, как это сделать) и связать его с QML, но я не понял, как заставить QML и javascript работать вместе так еще.

Я хотел бы увидеть что-то вроде следующего:

function rateLimitedRefresh(){ 
    // magic to limit to 30 frames per second 
    canvas.requestPaint() 
} 

onValueChanged: { 
    rateLimitedRefresh(); 
} 

С помощью метода requestPaint только будет вызван на холсте максимум 30 раз в секунду.

Я использовал модификацию ответа Мертаниана. Эта модификация обеспечивает ограничение скорости передачи кадров на уровне кадра в отличие от уровня в секунду.

property var limitStartTime: new Date() 

function rateLimitedRefresh(){ 
    // magic to limit to 30 frames per second 
    var now = new Date(); 

    if (now - limitStartTime >= 32) { 
     limitStartTime = now 
     canvas.requestPaint() 
    } 
} 

ответ

1

Как о чем-то вроде этого:

property var limitStartTime: new Date() 
property int refreshesThisSecond: 0 

function rateLimitedRefresh(){ 
    // magic to limit to 30 frames per second 
    if ((new Date()) - limitStartTime >= 33) { 
     limitStartTime = new Date(limitStartTime.getTime() + 33) 
     canvas.requestPaint() 
    } 
} 

onValueChanged: { 
    rateLimitedRefresh(); 
} 
Смежные вопросы