2009-07-31 31 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

使用計時器而不是事件。

相關問題