2009-07-31 30 views
0

我有一个QWidget,它处理mouseevent,即它按下鼠标左键时将mouseposition存储在列表中。 问题是,我无法告诉小部件每x毫秒只取一个点。如何仅在定义的时间获取事件?

什么是通常的方式来获得这些样本?

编辑:由于mouseevent不常被调用,是否有可能增加比率?

+0

如果你可以告诉你为什么你认为你需要限制鼠标事件的速度,我们可以帮助你更好。如果您查看Qt分布中的scribblearea示例,并且您将鼠标移动得非常快,您会发现两个鼠标事件之间的距离可能超过100像素,所以开始时速率似乎很低。 – 2009-07-31 18:10:26

+0

我想用它来模拟/测试从数据源(传感器)接收到的信号。用鼠标做一些测试更容易。 – Burkhard 2009-07-31 18:38:08

回答

3

听起来好像你根本不需要异步事件处理,你只需要以固定的时间间隔获取光标的位置。

设置一个定时器,每x毫秒触发一次。将它连接到获得值QCursor::pos()的插槽。如果您需要光标位置在您的窗口小部件的本地坐标中,请使用QWidget::mapFromGlobal()

如果您只想在按住鼠标左键的同时执行此操作,请使用mousePressEvent()mouseReleaseEvent()来启动/停止定时器。

1

你有两种选择。您可以在事件处理程序中放置一些逻辑,以存储上次事件的时间戳(以毫秒为单位)。然后,您检查每个事件的时间戳,并且只在适当的时间间隔过去时才存储该点。 (这是一种丑陋的方式)你可以在你的应用程序中的某个地方每隔x毫秒注册一次事件处理程序(如果其中一个尚未注册),然后让你的事件处理程序取消注册事件在你的处理程序中)。这样,当事件发生时,事件处理程序将取消注册,并且定时器将以您指定的时间间隔重新注册该事件。

1

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

1

将其过滤。只要忽略所有输入(不要把它放入列表),除非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(如果是在不同的线程,不可能在你的情况下),使用代理插槽直接连接你感兴趣的信号,过滤器里面,然后才发射你连接的信号排队。否则,你可能会不经意地发送事件循环。

+0

鼠标事件不是通过信号/插槽连接传递的,而是通过虚拟的`QWidget :: mouseEvent()`方法传递的。不过,你的一般想法是正确的。 – 2009-07-31 18:07:28

0

使用计时器而不是事件。

相关问题