假設我在主窗口中有一個小部件,並且只想在小部件上跟蹤鼠標位置:這意味着小部件的左下角必須是本地(0,0)。跟蹤Qt中的鼠標座標
問:我該怎麼做?
p.s.下面的函數都沒有這樣做。
widget->mapFromGlobal(QCursor::pos()).x();
QCursor::pos()).x();
event->x();
假設我在主窗口中有一個小部件,並且只想在小部件上跟蹤鼠標位置:這意味着小部件的左下角必須是本地(0,0)。跟蹤Qt中的鼠標座標
問:我該怎麼做?
p.s.下面的函數都沒有這樣做。
widget->mapFromGlobal(QCursor::pos()).x();
QCursor::pos()).x();
event->x();
恐怕你不滿意你的要求,左下角必須是(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,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();
}
我知道,我想要做的確切的事情是將其轉換到左下角。 – Mike
你問這裏:http://stackoverflow.com/questions/18551162/aligning-coordinate-systems。這是'自己動手'解決方案。我假設,在這裏提出這個問題,你問了一個更簡單的Qt方法。我必須讓你失望,我不知道如何讓Qt輕鬆切換座標系。你將不得不自己做座標轉換。如果我是你,我會嘗試與Qt系統共存。只需將(0,0)從上到下移動就會不必要地影響程序的性能。 – Greenflow
好吧,讓我們考慮一下WIDGET的左上角是(0,0)。無論如何,它會給出錯誤的結果 – Mike