假设我在主窗口中有一个小部件,并且想要仅在小部件上跟踪鼠标位置:这意味着小部件的左下角必须是本地的(0,0)。
问:我怎么能这样做?P.S。以下功能没有这样做。
widget->mapFromGlobal(QCursor::pos()).x();
QCursor::pos()).x();
event->x();
答案 0 :(得分:8)
我担心,你不满意你的要求'左下方必须是(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();
}
...将为您提供小部件中鼠标指针的坐标。
答案 1 :(得分:5)
如果您要做的只是报告鼠标在坐标中的位置,就好像小部件的左下角是(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();
}