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.rhkb.cn/news/212254.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

14、pytest像用参数一样使用fixture

官方实例 # content of test_fruit.py import pytestclass Fruit:def __init__(self, name):self.name nameself.cubed Falsedef cube(self):self.cubed Trueclass FruitSalad:def __init__(self, *fruit_bowl):self.fruit fruit_bowlself._cube_fruit()def _cube_fruit(s…

Oracle连接错误:ORA-28040:没有匹配的验证协议

一、产生原因&#xff1a;oci动态库版本太低&#xff0c;无法连接高版本的数据库 二、解决办法 1、下载高版本的oci库 https://www.oracle.com/database/technologies/instant-client/winx64-64- downloads.html 2、解压并复制oci动态库 3、粘贴到相应的目录 4、设置OCI环境…

YITH WooCommerce Product Bundles Premium电商商城产品捆绑销售高级版

点击阅读YITH WooCommerce Product Bundles Premium电商商城产品捆绑销售高级版原文 YITH WooCommerce Product Bundles Premium电商商城产品捆绑销售高级版的作用是在您的商店中创建特别优惠&#xff0c;将产品捆绑在一起提供折扣和特价。 您如何从中受益&#xff1a; 您将…

LESS的叶绿素荧光模拟实现——任意波段荧光模拟

目录 前言一、任意波段荧光模拟的实现二、需要注意的输入参数 前言 此专栏默认您对LESS (LargE-Scale remote sensing data and image Simulation framework) 模型和叶绿素荧光(Sun-Induced chlorophyll Fluorescence, SIF)有一定的了解。当然&#xff0c;您也可以在这里下载中…

Qt6 QRibbon 一键美化Qt界面

强烈推荐一个 github 项目&#xff1a; https://github.com/gnibuoz/QRibbon 作用&#xff1a; 在几乎不修改任何你自己代码的情况下&#xff0c;一键美化你的 UI 界面。 代码环境&#xff1a;使用 VS2019 编译 Qt6 GUI 程序&#xff0c;继承 QMainWindow 窗口类 一、使用方法 …

【广州华锐互动】风电场检修VR情景模拟提供接近真实的实操体验

风电场检修VR情景模拟系统由广州华锐互动开发&#xff0c;这是一种新兴的培训方式&#xff0c;它通过虚拟现实技术将风力发电场全范围进行1:1仿真建模还原&#xff0c;模拟监视风力发电场各种运行工况下的运行参数和指标&#xff0c;同时可进行升压站系统的巡视&#xff0c;倒闸…

Go 程序编译过程(基于 Go1.21)

版本说明 Go 1.21 官方文档 Go 语言官方文档详细阐述了 Go 语言编译器的具体执行过程&#xff0c;Go1.21 版本可以看这个&#xff1a;https://github.com/golang/go/tree/release-branch.go1.21/src/cmd/compile 大致过程如下&#xff1a; 解析 (cmd/compile/internal/synt…

【数据库】基于时间戳的并发访问控制,乐观模式,时间戳替代形式及存在的问题,与封锁模式的对比

使用时间戳的并发控制 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏会…

好用免费的AI换脸5个工具

在当今社会的发展中&#xff0c;人工智能&#xff08;Artificial Intelligence, AI&#xff09;扮演着关键的角色&#xff0c;其应用领域不断扩展。作为AI的一个分支&#xff0c;换脸技术近年来备受欢迎。这项技术使得将一个人的面部特征迁移到另一个人的照片或视频成为可能。除…

SQL面试题,判断if的实战应用

有如下表&#xff0c;请对这张表显示那些学生的成绩为及格&#xff0c;那些为不及格 1、创建表&#xff0c;插入数据 CREATE TABLE chapter8 (id VARCHAR(255) NULL,name VARCHAR(255) NULL,class VARCHAR(255) NULL,score VARCHAR(255) NULL );INSERT INTO chapter8 (id, n…

【C语言快速学习基础篇】之一基础类型、进制转换、数据位宽

文章目录 一、基础类型(根据系统不同占用字节数会有变化)1.1、有符号整形1.2、无符号整形1.3、字符型1.4、浮点型1.5、布尔型 二、进制转换2.1、二进制2.2、八进制2.3、十进制2.4、十六进制2.5、N进制2.6、进制转换关系对应表 三、数据位宽3.1、位3.2、字节3.3、字3.4、双字3.5…

Python Tornado 框架的终极指南!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Python Tornado框架是一个高性能的异步Web框架&#xff0c;被广泛应用于构建实时Web应用和API服务。本文将深度解析Tornado框架&#xff0c;介绍其核心概念、异步特性、路由系统、模板引擎以及WebSocket支持等方…

spring mvc理解

spring mvc M&#xff1a;model 模型 V&#xff1a;view 视图 C&#xff1a;controller 控制器 S: service 服务处理 D: Dao 数据持久化 视图 我理解就是web页面&#xff0c;帮助用户调用后端接口。 前后端分离之后&#xff0c;view似乎就和后端没什么关系了。 模型 格式…

采样率越高噪声越大?

ADC采样率指的是模拟到数字转换器&#xff08;ADC&#xff09;对模拟信号进行采样的速率。在数字信号处理系统中&#xff0c;模拟信号首先通过ADC转换为数字形式&#xff0c;以便计算机或其他数字设备能够处理它们。 ADC采样率通常以每秒采样的次数来表示&#xff0c;单位为赫…

代码随想录算法训练营第四十二天 _ 动态规划_01背包问题、416.分割等和子集。

学习目标&#xff1a; 动态规划五部曲&#xff1a; ① 确定dp[i]的含义 ② 求递推公式 ③ dp数组如何初始化 ④ 确定遍历顺序 ⑤ 打印递归数组 ---- 调试 引用自代码随想录&#xff01; 60天训练营打卡计划&#xff01; 学习内容&#xff1a; 二维数组处理01背包问题 听起来…

画好一张规范的原理图,这些点你可要注意了!

不光是代码有可读性的说法&#xff0c;原理图也有。很多时候原理图不仅仅是给自己看的&#xff0c;也会给其它人看&#xff0c;如果可读性差&#xff0c;会带来一系列沟通问题。所以&#xff0c;要养成良好习惯&#xff0c;做个规范的原理图。此外&#xff0c;一个优秀的原理图…

四、Zookeeper节点类型

目录 1、临时节点 2、永久节点 Znode有两种,分别为临时节点和永久节点。 节点的类型在创建时即被确定,并且不能改变。 1、临时节点 临时节点的生命周期依赖于创建它们的会话。一旦会话结束,临时节点将被自动删除,

论文阅读——Img2LLM(cvpr2023)

arxiv&#xff1a;[2212.10846] From Images to Textual Prompts: Zero-shot VQA with Frozen Large Language Models (arxiv.org) 一、介绍 使用大语言模解决VQA任务的方法大概两种&#xff1a;multi-modal pretraining and language-mediated VQA&#xff0c;即多模态预训练…

排序:直接选择排序

直接选择排序&#xff1a; 本质&#xff1a; 直接选择排序的本质就是在数组中进行遍历挑选出最大的元素&#xff0c;讲最大的元素放到对应的位置后&#xff0c;再次选出次大的位置&#xff0c;而后又放到对应的位置..........................直到数组成为一个有序序列。 优…

类和对象,this指针

一、类的引入&#xff1a; 如下&#xff0c;在C中&#xff0c;我们可以在结构体中定义函数&#xff0c;如下&#xff0c;之前我们学习C中中一直是在结构体中定义变量。 struct student{void studentinfo(const char* name,const char* gener,int age){ strcpy(_name,name);st…