跳到主要内容

坐标系小抄

Qt 中获取坐标的方法有很多,除了 event->pos()event->globalPos(),还有 各种映射坐标的方法,可以用于不同控件之间的坐标转换。


1. Qt 坐标系统核心方法

下面是常见的坐标获取和转换方法:

方法作用返回的坐标适用场景
event->pos()获取事件发生时的局部坐标相对事件控件的坐标鼠标、键盘事件
event->globalPos()获取事件发生时的全局坐标相对屏幕的坐标全局鼠标位置
widget->pos()获取控件的 父控件 内的坐标相对父控件的坐标窗口内的子控件
widget->mapToGlobal(QPoint p)p控件局部坐标 转换为 全局坐标相对屏幕的坐标获取控件在屏幕上的位置
widget->mapFromGlobal(QPoint p)p全局坐标 转换为 控件局部坐标相对控件的坐标计算鼠标点击的局部位置
widget->mapToParent(QPoint p)p控件局部坐标 转换为 父控件坐标相对父控件的坐标计算子控件在父窗口中的位置
widget->mapFromParent(QPoint p)p父控件坐标 转换为 局部坐标相对自身的坐标计算父窗口给子控件的坐标
widget->mapTo(QWidget* target, QPoint p)p 转换为 target 的坐标相对目标控件的坐标在不同控件间转换坐标
widget->mapFrom(QWidget* source, QPoint p)sourcep 转换为自身坐标相对自身的坐标多窗口交互时转换

2. Mermaid 图表:完整 Qt 坐标体系

下面是一个完整的 Qt 坐标体系网络,展示了不同的 坐标获取方式 以及 控件、事件的关系


3. 说明

  1. 事件的 event->pos() 是相对触发事件的控件的,但 event->globalPos() 是相对整个屏幕的
  2. widget->pos() 是相对其父控件的坐标,如果它是主窗口,则相对于桌面。
  3. mapToGlobal()mapFromGlobal() 用于全局坐标转换
    • mapToGlobal(p):把 p 从控件内部坐标转换到屏幕坐标
    • mapFromGlobal(p):把 p 从屏幕坐标转换到控件内部坐标
  4. mapToParent()mapFromParent() 用于父子控件间坐标转换
  5. mapTo(QWidget* target, QPoint p) 用于在两个不同控件间转换坐标

4. 代码示例

示例 1:将 QPushButton 位置从相对 MainWindow 变为全局坐标

QPoint globalPos = button->mapToGlobal(button->pos());
qDebug() << "Button 全局坐标:" << globalPos;
cpp

示例 2:将全局鼠标位置转换为 MainWindow 坐标

QPoint localPos = mainWindow->mapFromGlobal(QCursor::pos());
qDebug() << "鼠标相对 MainWindow 的位置:" << localPos;
cpp

示例 3:两个控件之间转换坐标

QPoint buttonInAnotherWidget = button->mapTo(anotherWidget, QPoint(0, 0));
qDebug() << "Button 相对 anotherWidget 的位置:" << buttonInAnotherWidget;
cpp

5. 总结

  1. 事件坐标
    • event->pos():相对当前事件控件
    • event->globalPos():相对屏幕
  2. 控件坐标
    • widget->pos():相对 父控件
    • widget->mapToGlobal(QPoint p):转成 全局坐标
    • widget->mapFromGlobal(QPoint p):从 全局坐标转成本地坐标
    • widget->mapToParent(QPoint p):转成 父控件坐标
    • widget->mapFromParent(QPoint p):从 父控件坐标转成本地坐标
    • widget->mapTo(QWidget* target, QPoint p):转换成 目标控件坐标
    • widget->mapFrom(QWidget* source, QPoint p):从 其他控件坐标转成本地坐标

有了这张 Mermaid 图表详细方法列表,你可以清楚地知道如何处理 事件坐标、控件坐标、全局坐标,以及如何 正确转换坐标。🚀 (by gpt)

请作者喝奶茶:
Alipay IconQR Code
Alipay IconQR Code
本文遵循 CC CC 4.0 BY-SA 版权协议, 转载请标明出处
Loading Comments...