2013-10-16 65 views
0

這是一個看起來無辜的簡單任務。小Widget窗口。每當它被拖動到桌面上時(通過用鼠標捕捉它的標題欄並移動它),它應該在實時打印出它的X和Y位置。移動過程中的Qt無法提供實時「窗口正在被拖動」事件

聽起來很簡單,但它似乎不可能在Qt中做到這一點。

無論我做什麼,當我抓住標題並移動窗口時,我都無法獲得實時事件。我有一個事件過濾器,但在拖動過程中只有零星的幾個事件進來 - moveEvents等只有在我釋放鼠標按鈕後。我需要每個運動像素的實時事件(或者至少每當窗口實際上在屏幕上移動時,儘可能接近實時)

是否有辦法在沒有鑽孔的情況下執行此操作OS?

我在Mac上使用Qt。

+0

真正的問題是:操作系統是否真的提供這樣的事件。如果是這樣,則不需要鑽取任何漏洞,只需添加本機事件篩選器即可。 –

回答

0

這是我首先想到的。此解決方案不提供實時事件處理,但我認爲它是非常接近它。如果足夠緩慢地移動窗口,則可以以像素精度捕捉運動。好吧,現在的實現(我相信代碼解釋了它是如何工作的):

class Widget : public QWidget 
{ 
    Q_OBJECT 
public: 
    Widget(QWidget *parent = 0) : QWidget(parent) 
    { 
     m_timer.setInterval(1); 
     connect(&m_timer, SIGNAL(timeout()), this, SLOT(onTimer())); 
     m_timer.start(); 
    } 

private slots: 
    void onTimer() 
    { 
     if (m_lastPos != pos()) { 
      // Window moved. 
      m_lastPos = pos(); 
      qDebug() << "Moved to:" << m_lastPos; 
     } 
    } 

private: 
    QPoint m_lastPos; 
    QTimer m_timer; 
}; 
+0

是的。我認爲這可能是解決方案。關注CPU使用率將保持不變。但也許在智能管理中,您可以捕獲NonClient窗口標題mouseDown事件(當您開始拖動時)和NonCLient窗口標題mouseUp事件,並且僅在這些事件之間啓動/停止計時器 - 當應用程序進入時它不會佔用CPU空閒模式 – JasonGenX

+0

是的,正確的。當然,這個例子可以進行優化和改進。 – vahancho