Допустим, у меня есть виджет в главном окне, и я хочу отслеживать положение мыши ТОЛЬКО на виджете: это означает, что левый нижний угол виджета должен быть локальным (0, 0).
Q: Как я могу это сделать?
постскриптум Ни одна из функций ниже не делает этого.
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 <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();
}