题
我有一个 QWidget
来处理 mouseevent
,即当按下鼠标左键时它会将 mouseposition
存储在列表中。
问题是,我无法告诉窗口小部件每x毫秒只能占一个点。
获取这些样品的常用方法是什么?
编辑:由于 mouseevent
不经常被调用,是否可以提高费率?
解决方案
听起来你根本不想要异步事件处理,你只想以固定的间隔获取光标的位置。
设置一个计时器,每隔x毫秒触发一次。将它连接到一个插槽,该插槽获取 QCursor :: pos()
的值。如果您需要在窗口小部件的本地坐标中使用光标位置,请使用 QWidget :: mapFromGlobal()
。
如果您只想在按住鼠标左键时执行此操作,请使用 mousePressEvent()
和 mouseReleaseEvent()
来启动/停止计时器。
其他提示
你有两个选择。您可以在事件处理程序中放置一些逻辑,以存储最后一个事件的时间戳(以毫秒为单位)。然后,您可以检查每个事件的时间戳,并且只有在适当的时间跨度已经过去时才存储该点。
(这是丑陋的方式)你总是可以在你的app中的某个地方有一个进程,每隔x毫秒(如果还没有注册)注册事件处理程序,然后让你的事件处理程序取消注册该事件在你的处理程序中)。这样,当事件发生时,事件处理程序将被取消注册,并且计时器会以指定的时间间隔重新注册事件。
你可以添加一个连接到设置布尔值为true的插槽的单次QTimer,并修改你的鼠标事件槽以首先检查以确保bool为真,如果将它设置为false,您通常要做的代码,然后在最后设置单次QTimer以x ms开始。
过滤它。只要忽略所有输入(不要将其放入列表中),除非已经过了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(如果它在不同的线程中,在您的情况下不太可能),请使用直接连接您有趣信号的代理插槽,在其中进行过滤,然后只发出连接排队的信号至。否则,您可能会无意识地向事件循环发送垃圾邮件。 使用计时器代替事件。
不隶属于 StackOverflow