本文介绍: 屏幕坐标系屏幕坐标系全局坐标系用于描述屏幕上的位置屏幕坐标系的原点通常位于显示器的左上角,与窗口坐标系的原点不一定对齐窗口坐标系:在窗口中,坐标系的原点通常位于窗口的左上角。返回坐标相对接收鼠标事件窗口部件局部坐标系,原点位于左上角,x 轴向右,y 轴向下延伸。返回的坐标相对接收鼠标事件窗口部件局部坐标系。具体来说,坐标系的原点位于窗口部件的左上角,x 轴向右延伸,y 轴向下延伸。,可以确保在处理右键点击事件之外的其他类型鼠标点击事件时,仍保留基类默认行为

qt-C++笔记识别点击鼠标右键点击位置以及Qt坐标系详解

code review!

1.示例运行

截图鼠标没截到 (・_・;

在这里插入图片描述

代码

#include <QApplication>
#include <QMainWindow>
#include <QMouseEvent>
#include <QDebug>

class MainWindow : public QMainWindow
{
public:
    MainWindow(QWidget *parent = nullptr) : QMainWindow(parent)
    {
        setWindowTitle("Right-Click Example");
    }

protected:
    void mousePressEvent(QMouseEvent *event) override
    {
        if (event->button() == Qt::RightButton)
        {
            QPoint position = event->pos();
            int x = position.x();
            int y = position.y();

            qDebug() << "Mouse clicked at position:" << position;
            qDebug() << "x-coordinate:" << x;
            qDebug() << "y-coordinate:" << y;
        }
        else
        {
            QMainWindow::mousePressEvent(event);
        }
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MainWindow window;
    window.show();

    return app.exec();
}

2.event->pos();详解

event->pos()一个用于获取鼠标事件位置成员函数。它返回一个 QPoint 对象表示鼠标事件发生的位置坐标。

上述代码中,event 是一个指向 QMouseEvent 对象指针,它表示一个鼠标事件通过调用 event->pos()可以获取鼠标事件发生时鼠标的位置坐标。

QPoint 是 Qt 框架提供的一个类,用于表示二维坐标。它具有 x()y() 方法,可用于分别获取 x 和 y 坐标值。

以下是一些关于 event->pos()示例用法

void mousePressEvent(QMouseEvent *event)
{
    QPoint position = event->pos();
    int x = position.x();
    int y = position.y();

    qDebug() << "Mouse clicked at position:" << position;
    qDebug() << "x-coordinate:" << x;
    qDebug() << "y-coordinate:" << y;
}

上述示例中,首先通过 event->pos() 获取鼠标事件的位置坐标,并将其存储在一个 QPoint 对象 position 中。然后使用 x()y() 方法分别获取 x 和 y 坐标值。最后通过调试输出将位置坐标和坐标值打印控制台

总结来说,event->pos() 是一个用于获取鼠标事件位置的函数,它返回一个 QPoint 对象表示鼠标事件发生的位置坐标。

3.event->pos()的坐标系原点

event->pos() 返回的坐标是相对于接收鼠标事件的窗口部件的局部坐标系。它表示鼠标事件发生的位置相对于该窗口部件左上角的偏移量

具体来说,坐标系的原点位于窗口部件的左上角,x 轴向右延伸,y 轴向下延伸。因此,如果 event->pos() 返回的坐标是 (x, y),那么表示鼠标事件发生在窗口部件中的 (x, y) 像素位置。

需要注意的是,窗口部件的坐标系是相对于其父级窗口或容器的。如果窗口部件是应用程序的主窗口,则其坐标系是相对于屏幕的。

如果需要将局部坐标转换全局坐标(屏幕坐标),可以使用 mapToGlobal() 函数例如event->pos().mapToGlobal() 将返回鼠标事件发生位置的全局坐标。

下面是一个示例展示如何使用 event->pos() 获取鼠标事件的局部坐标:

void mousePressEvent(QMouseEvent *event)
{
    QPoint localPos = event->pos();
    qDebug() << "Local mouse position:" << localPos;
}

上述示例中,event->pos() 返回的坐标被存储QPoint 对象 localPos 中,并通过调试输出打印控制台

总结来说,event->pos() 返回的坐标是相对于接收鼠标事件的窗口部件的局部坐标系,原点位于左上角,x 轴向右,y 轴向下延伸。如需将局部坐标转换全局坐标,可以使用 mapToGlobal() 函数

4.Qt中的坐标系详解

在Qt中,坐标系用于描述界面元素的位置和大小。Qt使用的坐标系是基于笛卡尔坐标系,具有以下特点:

  1. 坐标原点:Qt的坐标原点通常位于左上角,即(0, 0)。这意味着x轴向右增加,y轴向下增加。这种坐标系也被称为左上角坐标系。

  2. 单位:Qt中的坐标单位通常是像素(Pixel)。每个像素表示屏幕上的一个点用于测量定位界面元素的位置和大小

  3. 窗口坐标系:在窗口中,坐标系的原点通常位于窗口的左上角。窗口的左上角坐标为(0, 0),并且x轴向右延伸,y轴向下延伸。窗口坐标系用于描述窗口内部界面元素的位置和大小

  4. 屏幕坐标系:屏幕坐标系是全局的坐标系,用于描述屏幕上的位置。屏幕坐标系的原点通常位于显示器的左上角,与窗口坐标系的原点不一定对齐。屏幕坐标系可以用于将窗口坐标转换为全局坐标以及进行屏幕坐标上的操作

  5. 父子坐标系:在Qt中,界面元素(例如窗口、小部件)可以形成父子关系。对于子元素,其坐标一般相对于其父元素。子元素的坐标原点位于其父元素的左上角。

  6. 坐标转换:Qt提供了一些函数来进行坐标转换,例如:

    • mapToGlobal():将局部坐标转换为全局坐标。
    • mapFromGlobal():将全局坐标转换为局部坐标。
    • mapToParent():将子元素的局部坐标转换为父元素的坐标。
    • mapFromParent():将父元素的坐标转换为子元素的局部坐标。

总而言之,在Qt中,坐标系用于定位描述界面元素的位置和大小默认情况下,Qt使用左上角坐标系,原点位于窗口或界面元素的左上角。了解和理解Qt的坐标系是编写界面布局处理交互事件的重要基础。

5.QMainWindow::mousePressEvent(event);详解

QMainWindow::mousePressEvent(event) 是一个语句,用于调用基类 QMainWindowmousePressEvent 函数来处理鼠标点击事件。

代码中的 else 分支中,如果鼠标点击事件的按钮不是右键,那么会执行 QMainWindow::mousePressEvent(event)。这样做的目的是将处理其他类型的鼠标点击事件的责任委托基类实现

基类mousePressEvent 函数是 Qt 框架定义的一个虚函数,可以在子类中进行重写。它用于处理鼠标点击事件的默认行为通过调用基类mousePressEvent(event)可以确保在处理右键点击事件之外的其他类型的鼠标点击事件时,仍保留基类默认行为

这个特定的代码示例中,MainWindow继承QMainWindow,并重写mousePressEvent 函数。当鼠标点击事件的按钮不是右键时,通过调用 QMainWindow::mousePressEvent(event)可以继续执行基类 QMainWindow 的默认处理方式,以保持应用程序的正常行为

总结来说,QMainWindow::mousePressEvent(event) 是一个语句,用于调用基类 QMainWindowmousePressEvent 函数来处理除右键点击之外的其他类型的鼠标点击事件,以保持基类默认行为一致性

原文地址:https://blog.csdn.net/weixin_43297891/article/details/134762840

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_36314.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注