我有一个 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(如果它在不同的线程中,在您的情况下不太可能),请使用直接连接您有趣信号的代理插槽,在其中进行过滤,然后只发出连接排队的信号至。否则,您可能会无意识地向事件循环发送垃圾邮件。

使用计时器代替事件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top