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

StackOverflow https://stackoverflow.com/questions/1213229

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

Отфильтруйте это. Просто игнорируйте все входные данные (не помещайте их в список), если не прошло 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 в очереди (если оно находится в другом потоке, что маловероятно в вашем случае), используйте слот прокси-сервера, напрямую подключенный к вашему интересному сигналу, отфильтруйте его и только после этого подайте сигнал, который вы подключаете в очереди к. В противном случае вы можете спамить цикл событий как-то необычно.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top