Отслеживание координат мыши в Qt

Допустим, у меня есть виджет в главном окне, и я хочу отслеживать положение мыши ТОЛЬКО на виджете: это означает, что левый нижний угол виджета должен быть локальным (0, 0).

В: Как я могу это сделать?

p.s. НЕ функции ниже делают это.

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

person Mike    schedule 31.08.2013    source источник


Ответы (2)


Боюсь, вас не устроит ваше требование "нижний левый должен быть (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();
}

... даст вам координаты указателя мыши в вашем виджете.

person Greenflow    schedule 31.08.2013
comment
Я знаю это, и именно то, что я хочу сделать, это преобразовать его в нижний левый угол. - person Mike; 01.09.2013
comment
Вы спросили об этом здесь: stackoverflow.com/questions/18551162/. Это решение «сделай сам». Я предположил, что с этим вопросом здесь вы попросили более простой способ Qt. Я должен вас разочаровать, я не знаю, как заставить Qt легко переключать свою систему координат. Вы должны будете сделать преобразования координат самостоятельно. На вашем месте я бы попытался жить с системой Qt. Простое перемещение (0,0) из верхнего угла в нижний без необходимости повредит только производительности вашей программы. - person Greenflow; 01.09.2013
comment
Хорошо, давайте считать, что верхний левый угол WIDGET равен (0,0). В любом случае это дает неправильный вывод. - person Mike; 01.09.2013
comment
Насколько неправильно? Отлично работает для меня. Верхний левый угол (0,0), верхний правый угол (ширина,0), нижний левый угол (0, высота), нижний правый угол (ширина, высота). Отслеживание только внутри виджета. - person Greenflow; 01.09.2013

Если все, что вы хотите сделать, это сообщить положение мыши в координатах, как если бы нижний левый угол виджета был (0,0), а Y увеличивался при движении вверх, тогда приведенный ниже код делает это. Я думаю, что причина, по которой нужен такой код, ошибочна, поскольку координаты всего остального в указанном виджете не работают таким образом. Так зачем тебе это нужно, я не могу понять, но вот.

#include <QtWidgets>

class Window : public QLabel {
public:
    Window() {
        setMouseTracking(true);
        setMinimumSize(100, 100);
    }
    void mouseMoveEvent(QMouseEvent *ev) override {
        // vvv That's where the magic happens
        QTransform t;
        t.scale(1, -1);
        t.translate(0, -height()+1);
        QPoint pos = ev->pos() * t;
        // ^^^
        setText(QStringLiteral("%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();
}
person Kuba hasn't forgotten Monica    schedule 02.09.2013