2013-08-30 247 views
2

我有一個OpenGL窗口小部件,而知道我能得到我的鼠標的座標如下:獲取鼠標座標的Qt的OpenGL

X = this->mapFromGlobal(QCursor::pos()).x(); 
Y = this->mapFromGlobal(QCursor::pos()).y(); 

讓我們來想象我的鼠標爲(X,Y)上的小部件位置。現在我想在小部件上按下鼠標左鍵並將小工具移到小部件中的另一個地方(可以說(X',Y')),然後解壓鼠標左鍵。如何保持(X,Y)和(X',Y')?

回答

3

最簡單的辦法是將它們存儲爲成員,像這樣:

class MyGLWidget: public QGLWidget 
{ 
    // ... 

private: 
    int xAtPress, yAtPress; 
}; 

void MyGLWidget::mousePressEvent(QMouseEvent * event) 
{ 
    xAtPress = event->x(); 
    yAtPress = event->y(); 
} 

void MyGLWidget::mouseReleaseEvent(QMouseEvent * event) 
{ 
    int xAtRelease = event->x(); 
    int yAtRelease = event->y(); 

    // example code 
    int dx = xAtRelease - xAtPress; 
    int dy = yAtRelease - yAtPress; 
    translateObject(dx,dy); 
} 

注意:在使用event->pos()已經爲您提供了窗口小部件協調鼠標的位置,它比使用mapFromGlobal(QCursor::pos())

+0

感謝好得多答案。你能解釋一下爲什麼你最後做翻譯嗎? – Mike

+0

@Mike很高興有幫助:-)翻譯只是一個虛擬示例,用於顯示您需要{x | y} atPress和{x | y} atRelease的可能用途。我選擇了這個例子,因爲這是一個常見的用例,如果它令人困惑就忽略它;-) – Boris

+0

@Mike:我已經看到你的建議編輯被合理地拒絕了(政策不是編輯改變意義的東西,因爲這位職位的作者可能不同意)。在這種情況下,我確實不同意:'event-> pos()'總是給你光標相對於窗口部件左上角的位置(doc:'返回鼠標光標相對於窗口部件的位置接收事件')。經過多年的使用,我從來沒有見過這種方法失敗,包括使用'QGLWidget'的廣泛用法。如果你知道一個例子,我會很感興趣的。 – Boris