2013-08-31 5 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(); 
}