2013-08-31 190 views
4

假設我在主窗口中有一個小部件,並且只想在小部件上跟蹤鼠標位置:這意味着小部件的左下角必須是本地(0,0)。跟蹤Qt中的鼠標座標

問:我該怎麼做?

p.s.下面的函數都沒有這樣做。

widget->mapFromGlobal(QCursor::pos()).x(); 
QCursor::pos()).x(); 
event->x(); 

回答

7

恐怕你不滿意你的要求,左下角必須是(0,0)。在Qt座標系中(0,0)是左上角。如果你能接受。下面的代碼...

setMouseTracking(true); // E.g. set in your constructor of your widget. 

// Implement in your widget 
void MainWindow::mouseMoveEvent(QMouseEvent *event){ 
    qDebug() << event->pos(); 
} 

...會給你鼠標指針在你的小部件的座標。

+0

我知道,我想要做的確切的事情是將其轉換到左下角。 – Mike

+0

你問這裏:http://stackoverflow.com/questions/18551162/aligning-coordinate-systems。這是'自己動手'解決方案。我假設,在這裏提出這個問題,你問了一個更簡單的Qt方法。我必須讓你失望,我不知道如何讓Qt輕鬆切換座標系。你將不得不自己做座標轉換。如果我是你,我會嘗試與Qt系統共存。只需將(0,0)從上到下移動就會不必要地影響程序的性能。 – Greenflow

+0

好吧,讓我們考慮一下WIDGET的左上角是(0,0)。無論如何,它會給出錯誤的結果 – Mike

4

如果您只想報告鼠標在座標中的位置,就好像小部件的左下角是(0,0)並且Y在上升時是上升的那麼下面的代碼就是這樣做的。然而,我認爲想要這樣的代碼的原因是錯誤的,因爲所述小部件內的其他一切的座標不以這種方式工作。所以你爲什麼要這樣做,我無法理解,但在這裏你走了。

#include <QApplication> 
#include <QMouseEvent> 
#include <QTransform> 
#include <QLabel> 

class Window : public QLabel { 
public: 
    Window(QWidget *parent = 0, Qt::WindowFlags f = 0) : QLabel(parent, f) { 
     setMouseTracking(true); 
     setMinimumSize(100, 100); 
    } 
    void mouseMoveEvent(QMouseEvent *ev) { 
     // vvv That's where the magic happens 
     QTransform t; 
     t.scale(1, -1); 
     t.translate(0, -height()+1); 
     QPoint pos = ev->pos() * t; 
     // ^^^ 
     setText(QString("%1, %2").arg(pos.x()).arg(pos.y())); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    Window w; 
    w.show(); 
    return a.exec(); 
}