QGraphicsView的使用,view坐标,scene坐标,item坐标

Graphics View绘图构架

  1. QGraphicsScene(场景):可以管理多个图形项
  2. QGraphicsItem(图形项):也就是图元,支持鼠标事件响应。
  3. QGraphicsView(视图):关联场景可以让场景中的所有图形项可视化

QGraphicsView是QT的图形视图组件,在UI设计器的Display Widgets分组

QGraphicsView没有与mouseMoveEvent()相关的信号,需要继承自定义一个派生类

代码演示

工程文件不需要添加模块

注意事项是,graphics需要派生一个类才能用事件等相关信息

所以要新建一个派生类:

mygraphicsview.h

#ifndef MYGRAPHICSVIEW_H
#define MYGRAPHICSVIEW_H
 
#include <QObject>
#include <QGraphicsView>
 
class mygraphicsview : public QGraphicsView
{
    Q_OBJECT
public:
    explicit mygraphicsview(QWidget *parent = nullptr);
protected:
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
signals:
    void mouseMovePoint(QPoint point);
    void mouseClicked(QPoint point);
 
};
 
#endif // MYGRAPHICSVIEW_H

mygraphicsview.cpp

#include "mygraphicsview.h"
 
#include <QMouseEvent>
 
mygraphicsview::mygraphicsview(QWidget *parent) : QGraphicsView(parent)
{
 
}
 
void mygraphicsview::mousePressEvent(QMouseEvent *event)
{
    if(event->button()==Qt::LeftButton)
    {
        QPoint point = event->pos();//view坐标
        emit mouseClicked(point);
    }
    QGraphicsView::mousePressEvent(event);
}
 
void mygraphicsview::mouseMoveEvent(QMouseEvent *event)
{
    QPoint point = event->pos();
    emit mouseMovePoint(point);
    QGraphicsView::mouseMoveEvent(event);
}
 
 

 派生类的事件通过信号的方式发送出去,其他地方connect连接信号读取数据。

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QLabel>
#include <QMainWindow>
#include <QGraphicsScene>
 
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
private:
    QLabel *labViewCord;
    QLabel *labSceneCord;
    QLabel *labItemCord;
    QGraphicsScene *scene;
 
    void initGraphics();
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
 
private:
    Ui::MainWindow *ui;
 
private slots:
    void on_mouseMovePoint(QPoint point);
    void on_mouseClicked(QPoint point);
 
protected:
    void resizeEvent(QResizeEvent *event);
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
 
#include "mygraphicsview.h"
 
#include <QGraphicsRectItem>
 
void MainWindow::initGraphics()
{
    QRectF rect(-200,-100,400,200);
    scene = new QGraphicsScene(rect);
    ui->graphicsView->setScene(scene);
    QGraphicsRectItem *item = new QGraphicsRectItem(rect);
    item->setFlags(QGraphicsItem::ItemIsFocusable |
                   QGraphicsItem::ItemIsSelectable);
    QPen pen;
    pen.setWidth(2);
    item->setPen(pen);
    scene->addItem(item);
 
    //蓝色椭圆
    QGraphicsEllipseItem *item2 = new QGraphicsEllipseItem(-100,-50,200,100);
    item2->setPos(0,0);
    item2->setFlags(QGraphicsItem::ItemIsFocusable |
                    QGraphicsItem::ItemIsSelectable |
                    QGraphicsItem::ItemIsMovable);
    item2->setBrush(QBrush(Qt::blue));
    scene->addItem(item2);
    //红色小圆
    QGraphicsEllipseItem *item3 = new QGraphicsEllipseItem(-50,-50,100,100);
    item3->setPos(rect.right(),rect.bottom());
    item3->setFlags(QGraphicsItem::ItemIsFocusable |
                    QGraphicsItem::ItemIsSelectable |
                    QGraphicsItem::ItemIsMovable);
    item3->setBrush(QBrush(Qt::red));
    scene->addItem(item3);
}
 
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    labViewCord = new QLabel("View坐标:");
    labViewCord->setMidLineWidth(150);
    ui->statusbar->addWidget(labViewCord);
    labSceneCord = new QLabel("Scene坐标:");
    labSceneCord->setMidLineWidth(150);
    ui->statusbar->addWidget(labSceneCord);
    labItemCord = new QLabel("Item坐标:");
    labItemCord->setMidLineWidth(150);
    ui->statusbar->addWidget(labItemCord);
 
    ui->graphicsView->setCursor(Qt::CrossCursor);//光标
    ui->graphicsView->setMouseTracking(true);//跟随鼠标
 
    connect(ui->graphicsView,&mygraphicsview::mouseMovePoint,
            this,&MainWindow::on_mouseMovePoint);
    connect(ui->graphicsView,&mygraphicsview::mouseClicked,
            this,&MainWindow::on_mouseClicked);
 
    initGraphics();
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::on_mouseMovePoint(QPoint point)
{
    labViewCord->setText(QString::asprintf("View坐标:%d,%d",
                                           point.x(),point.y()));
    QPointF pointScene = ui->graphicsView->mapToScene(point);
    labSceneCord->setText(QString::asprintf("Scene坐标:%.0f,%.0f",
                                           pointScene.x(),pointScene.y()));
}
 
void MainWindow::on_mouseClicked(QPoint point)
{
    QPointF pointScene = ui->graphicsView->mapToScene(point);
    QGraphicsItem *item = NULL;
    item = scene->itemAt(pointScene,ui->graphicsView->transform());
    if(item!=NULL)
    {
        QPointF pointItem = item->mapFromScene(pointScene);
        labItemCord->setText(QString::asprintf("Item坐标%.0f,%.0f",
                                     pointItem.x(),pointItem.y()));
    }
}
 
void MainWindow::resizeEvent(QResizeEvent *event)
{
    Q_UNUSED(event)
    ui->label->setText(QString::asprintf("Graphics View坐标"
                                         "宽=%d,高=%d",
                                         ui->graphicsView->width(),
                                         ui->graphicsView->height()));
    QRectF rect = ui->graphicsView->sceneRect();
    ui->label_2->setText(QString::asprintf("QGraphicsView::sceneRect="
                                           "(L,T,W,H)=%.0f,%.0f,%.0f,%.0f",
                                           rect.left(),
                                           rect.top(),
                                           rect.width(),
                                           rect.height()));
}
 

ui部分要注意,需要吧graphics的窗口提升关联到派生类,不要用他的默认类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/479183.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于python+vue学生作业管理系统flask-django-nodejs-php

快速发展的社会中&#xff0c;人们的生活水平都在提高&#xff0c;生活节奏也在逐渐加快。为了节省时间和提高工作效率&#xff0c;越来越多的人选择利用互联网进行线上打理各种事务&#xff0c;然后线上管理系统也就相继涌现。与此同时&#xff0c;人们开始接受方便的生活方式…

IDEA/Android Studio格式化代码快捷键失效的解决

问题描述 用AS写一个项目的时候&#xff0c;发现CtrlAltL的格式化快捷键并不生效&#xff0c;按下之后没有任何反应。而格式化文件快捷键CtrlAltShiftL依旧生效&#xff0c;难道是设置出了问题&#xff1f; 打开设置页面发现快捷键设置很正确&#xff0c;并没问题&#xff0c…

掌握C语言结构体,开启编程新世界

✨✨欢迎&#x1f44d;&#x1f44d;点赞☕️☕️收藏✍✍评论 个人主页&#xff1a;秋邱博客 所属栏目&#xff1a;C语言 &#xff08;感谢您的光临&#xff0c;您的光临蓬荜生辉&#xff09; 前言 前面我们也涉及到了结构体的讲解&#xff0c;但是只是粗略的讲了一下。 接下…

力扣hot100题解(python版91-95题)

91、不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&…

java分割等和子集(力扣Leetcode416)

分割等和子集 力扣原题链接 给你一个只包含正整数的非空数组nums。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,5] 输出&#xff1a;true 解释&#xff1a;数组可以分割成 [1, 5, 5] …

【深度学习基础知识】IOU、GIOU、DIOU、CIOU

这里简单记录下IOU及其衍生公式。   为了拉通IOU及其衍生版的公式对比&#xff0c;以及方便记忆&#xff0c;这里用一个统一的图示来表示出所有的参数 【&#xff21;】目标框的区域【&#xff22;】预测框的区域【&#xff23;】&#xff21;与&#xff22;的交集【&#xff…

关于TEMU 亚马逊美国哺乳枕(Nursing Pillow)法规16 CFR 1242介绍

美国首个哺乳枕法规16 CFR 1242发布 美国消费品安全委员会CPSC于2023年9月26日在联邦公报上发布了哺乳枕新法规16 CFR 1242的草案&#xff0c;旨在降低哺乳枕使用带来的伤害和死亡风险。该法规草案提到了在使用哺乳枕时由于婴儿睡着或无人看护而导致的窒息、陷落和跌落风险。在…

2024:RAG年

如果 2023 年都是关于 ChatGPT 和 Llama-2 等基础LLM&#xff0c;那么我的预测是 2024 年将是关于检索增强一代&#xff08;RAG&#xff09;的。 在这篇博文中&#xff0c;我阐述了为什么 RAG 将在 2024 年飞速发展&#xff0c;不仅是企业采用率&#xff0c;而且消费者采用率也…

BigDecimal类的使用,用于精确计算任意精度的数字

BigDecimal类 BigDecimal 是 Java 中用于精确表示任意精度的十进制数的类。在很多情况下,使用基本数据类型(如 double 或 float)进行浮点数计算可能会导致精度丢失或舍入错误。BigDecimal 提供了一种更精确的解决方案,可以处理需要高精度计算的场景,比如财务应用或科学计算…

记录解决问题--activiti8.2 流程图图片由png改为svg前端不显示图片问题

1.说明 如果是vue svg显示&#xff0c;请查阅其他标准资料&#xff0c;类似使用svg标签。我这里讲的另外一种情况&#xff0c;链接返回的是svg文件&#xff0c;需要用v-html显示图片。 2.activiti6流程图图片格式 ①png格式。可以查看链接返回&#xff0c;以png开头。 ②前端…

蓝桥杯练习——神秘咒语——axios

目标 完善 index.js 中的 TODO 部分&#xff0c;通过新增或者修改代码&#xff0c;完成以下目标&#xff1a; 点击钥匙 1 和钥匙 2 按钮时会通过 axios 发送请求&#xff0c;在发送请求时需要在请求头中添加 Authorization 字段携带 token&#xff0c;token 的值为 2b58f9a8-…

适合新生儿的奶瓶有哪些?五款高分新生儿奶瓶分享!

每一个有新生儿的家庭都一定会挑选奶瓶&#xff0c;但是因为市面有太多品牌和款式&#xff0c;让大家难以挑选&#xff0c;更为重要的是还有可能会不小心选到劣质的产品&#xff0c;不仅奶嘴的仿真度差、易胀气&#xff0c;还可能高温消毒后散发有害物质&#xff01;那么新生儿…

力扣 字符串解码

维护一个放数字的栈&#xff0c;一个放字母的栈 遇到[把数字和字母入栈&#xff0c;遇到]把当前字母循环加上数字栈头遍的字母栈头 class Solution { public:string decodeString(string s) {string ans"";stack<int>sz;stack<string>zm;里面是string …

2024 年 AI 辅助研发趋势将更加强调智能化、自动化和个性化

目录 前言 AI辅助研发的技术进展 行业应用案例 医药行业 汽车行业 电子行业 面临的挑战与机遇 技术挑战 伦理问题 数据安全 机遇和解决方案 未来趋势预测 1. 深度融合AI与研发流程 2. 智能研发平台的崛起 3. 强化AI与人类智慧的融合 前言 当谈到人工智能&#xff…

论文笔记:Llama 2: Open Foundation and Fine-Tuned Chat Models

导语 Llama 2 是之前广受欢迎的开源大型语言模型 LLaMA 的新版本&#xff0c;该模型已公开发布&#xff0c;可用于研究和商业用途。本文记录了阅读该论文的一些关键笔记。 链接&#xff1a;https://arxiv.org/abs/2307.09288 1 引言 大型语言模型&#xff08;LLMs&#xff…

Linux:http协议初步认识

文章目录 OSI七层模型http协议域名路径信息请求和响应 编写一个httpserver OSI七层模型 在结束了前面对于序列化反序列化等内容的学习后&#xff0c;重新回到对于OSI模型的部分 如上所示的是对于OSI接口的示意图&#xff0c;在这当中可以看到会话层的概念&#xff0c;会话层的…

CMake学习(下)

1. 嵌套的CMake 如果项目很大&#xff0c;或者项目中有很多的源码目录&#xff0c;在通过CMake管理项目的时候如果只使用一个CMakeLists.txt&#xff0c;那么这个文件相对会比较复杂&#xff0c;有一种化繁为简的方式就是给每个源码目录都添加一个CMakeLists.txt文件&#xff…

携程旅行web逆向

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872 本文章…

C语言:volatile关键字讲解

读音&#xff1a;vaoletail C语言中的volatile关键字是一个重要的类型修饰符&#xff0c;它用于声明一个变量具有“易变性”&#xff0c;即可能在编译器无法察觉的情况下被改变其值。Volatile意思是“易变的”&#xff0c;应该解释为“直接存取原始内存地址”比较合适。 “易变…

【高质快刊】中科院1区TOP,最新案例仅2个月14天录用!进展超顺,即将截稿!

&#xff08;一&#xff09;期刊简介概况 【期刊类型】能源工程类SCIE&EI 【出版社】ELSEVIER出版社 【期刊概况】IF&#xff1a;11.0-12.0&#xff0c;JCR1区&#xff0c;中科院1区TOP 【预警情况】2020-2024年无预警记录 【收录年份】1977年被WOS数据库收录 【年发…