我有一個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