当前位置: 首页 > news >正文

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

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

code review!

文章目录

  • qt-C++笔记之识别点击鼠标右键、点击位置以及Qt坐标系详解
    • 1.示例运行
    • 2.event->pos();详解
    • 3.event->pos()的坐标系原点
    • 4.Qt中的坐标系详解
    • 5.QMainWindow::mousePressEvent(event);详解

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 函数来处理除右键点击之外的其他类型的鼠标点击事件,以保持基类默认行为的一致性。

http://www.lryc.cn/news/251939.html

相关文章:

  • 小程序开发平台源码系统:搭建新的商业体系 附带完整的搭建教程
  • css3新增的伪类有哪些?
  • 开源软件license介绍与检测
  • 【LeeCode】142.环形链表II
  • nodejs微信小程序+python+PHP健身房信息管理系统的设计与实现-计算机毕业设计推荐
  • springboot集成springsecurity
  • 脏读、不可重复读、幻读
  • 思维模型 反馈效应
  • 【PyTorch】线性回归
  • 硝烟弥漫的科技战场——GPT之战
  • re:Invent 构建未来:云计算生成式 AI 诞生科技新局面
  • oneApi实现并⾏排序算法
  • 语音芯片的BUSY状态指示功能特征:提升用户体验与系统稳定性的关键
  • Leetcode2661. 找出叠涂元素
  • 免费最新6款热门SEO优化排名工具
  • 绝地求生在steam叫什么?
  • Elasticsearch:什么是大语言模型(LLM)?
  • Kubernetes1.27容器化部署Prometheus
  • fasterxml 注解组装实体
  • 自写一个函数将js对象转为Ts的Interface接口
  • 【数据结构】拆分详解 - 二叉树的链式存储结构
  • Laravel修改默认的auth模块为md5(password+salt)验证
  • OpenStack-train版安装之安装Keystone(认证服务)、Glance(镜像服务)、Placement
  • 【九日集训】第九天:简单递归
  • Prime 1.0
  • Java 如何正确比较两个浮点数
  • Qt 如何操作SQLite3数据库?数据库创建和表格的增删改查?
  • 【Hadoop】分布式文件系统 HDFS
  • 【Python-随笔】使用Python实现屏幕截图
  • Sun Apr 16 00:00:00 CST 2023格式转换