0

我有一个QWidget处理 的mouseevent,即mouseposition当按下鼠标左键时它将 存储在一个列表中。问题是,我不能告诉小部件每 x 毫秒只取一个点。

获取这些样本的常用方法是什么?

编辑:由于mouseevent不经常调用,是否可以提高速率?

4

5 回答 5

3

It sounds like you don't want asynchronous event handling at all, you just want to get the location of the cursor at fixed intervals.

Set up a timer to fire every x milliseconds. Connect it to a slot which gets the value of QCursor::pos(). Use QWidget::mapFromGlobal() if you need the cursor position in coordinates local to your widget.

If you only want to do this while the left mouse button is held down, use mousePressEvent() and mouseReleaseEvent() to start/stop the timer.

于 2009-07-31T21:51:58.877 回答
1

你有两个选择。您可以在存储最后一个事件的时间戳(以毫秒为单位)的事件处理程序中放置一些逻辑。然后,您检查每个事件的时间戳,并且仅在经过适当的时间跨度时才存储该点。

(这是丑陋的方式)您总是可以在您的应用程序中的某处有一个进程,每 x 毫秒注册一次事件处理程序(如果尚未注册),然后让您的事件处理程序在您的处理程序中取消注册事件)。这样,当事件发生时,事件处理程序将被取消注册,并且计时器会以您指定的时间间隔重新注册该事件。

于 2009-07-31T15:39:38.613 回答
1

您可以添加一个连接到将布尔值设置为 true 的插槽的单次 QTimer,并修改您的鼠标事件插槽以首先检查以确保 bool 为 true,如果将其设置为 false,请执行您的代码通常会这样做,然后最后将单次 QTimer 设置为在 x 毫秒内关闭。

于 2009-07-31T15:40:23.883 回答
1

过滤它。除非 x ms 已经过去,否则只需忽略所有输入(不要将其放入列表中)。

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 的排队连接(如果它在不同的线程中,在您的情况下不太可能),请使用代理插槽直接连接您感兴趣的信号,在其中过滤,然后才发出您连接到排队的信号。否则,您可能会不必要地向事件循环发送垃圾邮件。

于 2009-07-31T15:57:18.123 回答
0

使用计时器而不是事件。

于 2009-07-31T21:57:19.207 回答