我有一个QWidget
,它处理mouseevent
,即它按下鼠标左键时将mouseposition
存储在列表中。 问题是,我无法告诉小部件每x毫秒只取一个点。如何仅在定义的时间获取事件?
什么是通常的方式来获得这些样本?
编辑:由于mouseevent
不常被调用,是否有可能增加比率?
我有一个QWidget
,它处理mouseevent
,即它按下鼠标左键时将mouseposition
存储在列表中。 问题是,我无法告诉小部件每x毫秒只取一个点。如何仅在定义的时间获取事件?
什么是通常的方式来获得这些样本?
编辑:由于mouseevent
不常被调用,是否有可能增加比率?
听起来好像你根本不需要异步事件处理,你只需要以固定的时间间隔获取光标的位置。
设置一个定时器,每x毫秒触发一次。将它连接到获得值QCursor::pos()
的插槽。如果您需要光标位置在您的窗口小部件的本地坐标中,请使用QWidget::mapFromGlobal()
。
如果您只想在按住鼠标左键的同时执行此操作,请使用mousePressEvent()
和mouseReleaseEvent()
来启动/停止定时器。
你有两种选择。您可以在事件处理程序中放置一些逻辑,以存储上次事件的时间戳(以毫秒为单位)。然后,您检查每个事件的时间戳,并且只在适当的时间间隔过去时才存储该点。 (这是一种丑陋的方式)你可以在你的应用程序中的某个地方每隔x毫秒注册一次事件处理程序(如果其中一个尚未注册),然后让你的事件处理程序取消注册事件在你的处理程序中)。这样,当事件发生时,事件处理程序将取消注册,并且定时器将以您指定的时间间隔重新注册该事件。
您可以添加一个连接到插槽的单次QTimer,该插槽将布尔值设置为true,并修改鼠标事件插槽以首先检查以确保布尔值为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(如果是在不同的线程,不可能在你的情况下),使用代理插槽直接连接你感兴趣的信号,过滤器里面,然后才发射你连接的信号排队。否则,你可能会不经意地发送事件循环。
鼠标事件不是通过信号/插槽连接传递的,而是通过虚拟的`QWidget :: mouseEvent()`方法传递的。不过,你的一般想法是正确的。 – 2009-07-31 18:07:28
使用计时器而不是事件。
如果你可以告诉你为什么你认为你需要限制鼠标事件的速度,我们可以帮助你更好。如果您查看Qt分布中的scribblearea示例,并且您将鼠标移动得非常快,您会发现两个鼠标事件之间的距离可能超过100像素,所以开始时速率似乎很低。 – 2009-07-31 18:10:26
我想用它来模拟/测试从数据源(传感器)接收到的信号。用鼠标做一些测试更容易。 – Burkhard 2009-07-31 18:38:08