在Qt中跟踪鼠标坐标

6
假设我在主窗口中有一个小部件,并且想要仅跟踪小部件上的鼠标位置:这意味着小部件的左下角必须是局部坐标(0,0)。
问:我该如何做到这一点?
附注:以下函数都不会实现此功能。
widget->mapFromGlobal(QCursor::pos()).x();
QCursor::pos()).x();
event->x();
2个回答

10

我担心您对要求“左下角必须为(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();
}

...将为您提供小部件中鼠标指针的坐标。


我知道,我想要做的确切事情是将其转换为左下角。 - Mike
你在这里提出了这个问题:https://dev59.com/gHbZa4cB1Zd3GeqPElVv。这是一个“自己动手”的解决方案。我假设,通过这个问题,你询问了一种更简单的Qt方式。很抱歉,我不知道有什么方法可以让Qt轻松切换其坐标系。你必须自己进行坐标转换。如果我是你,我会尝试使用Qt系统。只是将(0,0)从上角移动到下角只会不必要地损害程序的性能。 - Greenflow
好的,让我们考虑WIDGET的左上角是(0,0)。它仍然会给出错误的输出。 - Mike
有多远的偏差?对我来说完美地工作。左上角是(0,0),右上角是(width,0),左下角是(0,height),右下角是(width,height)。仅在小部件内跟踪。 - Greenflow

7

如果你只是想报告鼠标在坐标上的位置,就好像小部件的左下角是(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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接