Как приобрести событие только в определенное время? - PullRequest
0 голосов
/ 31 июля 2009

У меня есть QWidget, который обрабатывает mouseevent, то есть он сохраняет mouseposition в списке при нажатии левой кнопки мыши. Проблема в том, что я не могу сказать виджету принимать только одну точку каждые x мс.

Каким был бы обычный способ получить эти образцы?

Редактировать: поскольку mouseevent вызывается не очень часто, возможно ли увеличить скорость?

Ответы [ 5 ]

3 голосов
/ 01 августа 2009

Похоже, вы вообще не хотите обрабатывать асинхронные события, вы просто хотите получить местоположение курсора через фиксированные интервалы.

Установите таймер на срабатывание каждые х миллисекунд. Подключите его к слоту, который получает значение QCursor::pos(). Используйте QWidget::mapFromGlobal(), если вам нужно положение курсора в координатах, локальных для вашего виджета.

Если вы хотите сделать это только при удержании левой кнопки мыши, используйте mousePressEvent() и mouseReleaseEvent() для запуска / остановки таймера.

1 голос
/ 31 июля 2009

Вы можете добавить однократный QTimer, который подключен к слоту, который устанавливает логическое значение в true, и изменить ваш слот событий мыши для первой проверки, чтобы убедиться, что bool имеет значение true, и если для него установлено значение false, выполните код, который вы обычно будете делать, затем в конце установите однократный QTimer в x мс.

1 голос
/ 31 июля 2009

Отфильтруйте это. Просто игнорируйте все входные данные (не помещайте их в список), если не прошло x мс.

QTime m_time; // member of your class
int m_interval = 100; // ms

void MyWidget::StartCapturing()
{
    m_time.start();
}

void MyWidget::OnMouseEvent(...)
{
    if(m_time.elapsed() < m_interval)
        return;

    // process event

    m_time.reset();         
}

РЕДАКТИРОВАТЬ: Если по какой-либо случайности вы используете подключение с очередями к OnMouseEvent (если оно находится в другом потоке, что маловероятно в вашем случае), используйте слот прокси-сервера, напрямую связывающий интересующий вас сигнал, фильтруйте его и только затем излучайте сигнал, который вы подключаете в очереди к. В противном случае вы могли бы спамить цикл событий без необходимости.

1 голос
/ 31 июля 2009

У вас есть два варианта. Вы можете добавить некоторую логику в обработчик событий, который хранит метку времени (в миллисекундах) последнего события. Затем вы проверяете эту временную метку с каждым событием и сохраняете точку только в том случае, если прошло правильное время.

(это ужасный способ). В вашем приложении всегда может быть процесс, который регистрирует обработчик события каждые x миллисекунд (если он еще не зарегистрирован), а затем отменяет регистрацию вашего обработчика события для события. в вашем обработчике). Таким образом, когда событие происходит, обработчик события становится незарегистрированным, а таймер перерегистрирует событие с заданным интервалом.

0 голосов
/ 01 августа 2009

Используйте таймер вместо событий.

...