QGraphicsView 放大导致QGraphicsItem不更新

news2024/11/15 7:57:41

其实这个问题,原因是QGraphicsItem的boundingRect的范围不在当前的View范围内,当然不会刷新,特别是自定义的一些Item,特别要注意自己的boundingrect是否在准确的位置,所以其实是boundingrect没有自动更新位置导致的。

当遇到相似的问题时,不妨把boundingrect画出来就可以见分晓了。
下面是我们的代码:

#ifndef LIDARPOINTS_H
#define LIDARPOINTS_H


#include <QColor>
#include <QGraphicsItem>
#include <QImage>

class Lidarpoints : public QGraphicsItem
{
public:
    Lidarpoints(const QColor &color, int x, int y);
    Lidarpoints(/*const QImage image*/);

    void setLidarData(QPoint pos, std::vector<QPoint>& data);

    QRectF boundingRect() const Q_DECL_OVERRIDE;
    QPainterPath shape() const Q_DECL_OVERRIDE;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *item, QWidget *widget) Q_DECL_OVERRIDE;



protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *event) Q_DECL_OVERRIDE;
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event) Q_DECL_OVERRIDE;
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) Q_DECL_OVERRIDE;

private:
    int x;
    int y;
    QColor color;
    QVector<QPointF> stuff;

    //
    QImage imageContent;

    std::vector<QPoint> lidar_points;

    bool paint_state = false;

    int rect_value = 100;

    QRectF paintRect;
};

#endif // LIDARPOINTS_H

#include "lidarpoints.h"
#include <QtWidgets>
#include <iostream>

Lidarpoints::Lidarpoints(const QColor &color, int x, int y)
{
    this->x = x;
    this->y = y;
    this->color = color;
    //
    //setZValue(1000);

    setFlags(ItemIsSelectable | ItemIsMovable);
    setAcceptHoverEvents(true);

    //QSize size(20,20);
    paintRect.setRect(0,0,20,20);
}

Lidarpoints::Lidarpoints(/*const QImage image*/)
{
    //this->imageContent = image;
}


QRectF Lidarpoints::boundingRect() const
{
    //return paintRect;
    return paintRect;

}

QPainterPath Lidarpoints::shape() const
{
    QPainterPath path;
    path.addRect(14, 14, 82, 42);
    return path;
}

void Lidarpoints::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    Q_UNUSED(widget);

    const qreal lod = option->levelOfDetailFromTransform(painter->worldTransform());

    std::cout << "lod " << lod << std::endl;

    //QRect rect(0,0,imageContent.width(),imageContent.height());

    //painter->setCompositionMode(QPainter::CompositionMode_Overlay);

    //painter->drawImage(rect,imageContent);

    //painter->setPen(QPen(Qt::blue,4));//设置画笔形式
    //painter->drawRect(rect);
     //painter->drawEllipse(QPoint(0,0),20,20);//画圆
    std::cout << "paint now" << std::endl;

    QPen pen;
    pen.setColor(Qt::red);  // 画笔颜色设置
    //pen.setWidth(10);
    painter->setPen(pen);

    for(auto it : lidar_points){
        painter->drawPoint(it.x(), -1*it.y());
    }


    //QRect rect(0,0,rect_value,rect_value);
    //painter->drawRect(rect);
    //rect_value+=1;
    //std::cout << "rect_value " << rect_value << std::endl;

    /*
    QRectF rect = boundingRect();

    std::cout << "rect " << rect.x()
                      << "  " << rect.y()
                      << "  " << rect.width()
                      << "  " << rect.height()
                      << std::endl;
    painter->drawRect(rect);
    */

    paint_state = true;

}

void Lidarpoints::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    QGraphicsItem::mousePressEvent(event);
    update();
}

void Lidarpoints::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    //
    //prepareGeometryChange();

    if (event->modifiers() & Qt::ShiftModifier) {
        stuff << event->pos();
        update();
        return;
    }
    QGraphicsItem::mouseMoveEvent(event);
}

void Lidarpoints::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
    QGraphicsItem::mouseReleaseEvent(event);
    update();
}

void Lidarpoints::setLidarData(QPoint pos,  std::vector<QPoint>& data){


    paintRect.setRect(pos.x(), pos.y(),20,20);
    prepareGeometryChange();
    //boundingRect();

    if(paint_state == true){
        std::cout << "Lidarpoints::setLidarData " << lidar_points.size() << std::endl;
        lidar_points.clear();
        lidar_points = data;
    }
    else{

        //std::cout << "auto paint fail " << std::endl;
       // lidar_points.clear();
        //lidar_points = data;
        // 调用此函数以告知 Qt 几何形状即将改变
        //prepareGeometryChange();
        //update();

    }

        paint_state = false;

}

大家可以做个参考。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Hive】【HiveQL】【大数据技术基础】 实验四 HBase shell命令实验

实验四&#xff1a;熟悉常用的HBase操作 实验概览 在本次实验中&#xff0c;我们将深入探索HBase在Hadoop生态系统中的角色&#xff0c;并熟练掌握常用的HBase Shell命令和Java API操作。通过这些实践&#xff0c;我们能够更好地理解HBase的工作原理以及如何在实际项目中应用。…

3D意识(3D Awareness)浅析

一、简介 3D意识&#xff08;3D Awareness&#xff09;主要是指视觉基础模型&#xff08;visual foundation models&#xff09;对于3D结构的意识或感知能力&#xff0c;即这些模型在处理2D图像时是否能够理解和表示出图像中物体或场景的3D结构&#xff0c;其具体体现在编码场景…

快递面单批量导入打印软件小程序下载 佳易王网店快递面单批量打印管理系统操作教程

一、概述 【软件文件资源在文章最后】 快递面单批量导入打印软件小程序下载 快递面单批量打印管理系统操作教程 直接使用快递空白单打印&#xff0c;可以扫描条码并可以查询快递信息&#xff0c;面单内容可以自定义。 可以批量导入批量打印&#xff0c;从而提高效率节省时间…

缓冲区溢出,数据被踩的案例学习

继续在ubuntu上学习GDB&#xff0c;今天要学习的是缓冲区溢出。 程序的地址&#xff1a; GitHub - gedulab/gebypass: bypass password by heap buffer overflow 编译的方法&#xff1a; gcc -g -O2 -o gebypass gebypass.c 照例设置一下科学shangwang代理&#xff1a; e…

数据库SQL——连接表达式(JOIN)图解

目录 一、基本概念 二、常见类型 内连接&#xff08;INNER JOIN&#xff09;&#xff1a; 左连接&#xff08;LEFT JOIN 或 LEFT OUTER JOIN&#xff09;&#xff1a; 右连接&#xff08;RIGHT JOIN 或 RIGHT OUTER JOIN&#xff09;&#xff1a; 全连接&#xff08;FULL…

sql注入之二次注入(sqlilabs-less24)

二阶注入&#xff08;Second-Order Injection&#xff09;是一种特殊的 SQL 注入攻击&#xff0c;通常发生在用户输入的数据首先被存储在数据库中&#xff0c;然后在后续的操作中被使用时&#xff0c;触发了注入漏洞。与传统的 SQL 注入&#xff08;直接注入&#xff09;不同&a…

查询DBA_FREE_SPACE缓慢问题

这个是一个常见的问题&#xff0c;理论上应该也算是一个bug&#xff0c;在oracle10g&#xff0c;到19c&#xff0c;我都曾经遇到过&#xff1b;今天在给两套新建的19C RAC添加监控脚本时&#xff0c;又发现了这个问题&#xff0c;在这里记录一下。 Symptoms 环境&#xff1a;…

实验6记录网络与故障排除

实验6记录网络与故障排除 实验目的及要求&#xff1a; 通过实验&#xff0c;掌握如何利用文档记录网络设备相关信息并完成网络拓扑结构的绘制。能够使用各种技术和工具来找出连通性问题&#xff0c;使用文档来指导故障排除工作&#xff0c;确定具体的网络问题&#xff0c;实施…

「QT」文件类 之 QTextStream 文本流类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定制…

【go从零单排】JSON序列化和反序列化

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在 Go 语言中&#xff0c;处理 JSON 数据主要依赖于 encoding/json 包。这个包提…

网络学习第四篇

引言&#xff1a; 我们在第三篇的时候出现了错误&#xff0c;我们要就行排错&#xff0c;那么我们要知道一下怎么配置静态路由实现ping通&#xff0c;这样子我们才知道下一跳到底是什么&#xff0c;为什么这样子做。 实验目的 理解和掌握静态路由的基本概念和配置方法。 实…

蓝桥杯竞赛单片机组备赛【经验帖】

本人获奖情况说明 笔者本人曾参加过两次蓝桥杯电子赛&#xff0c;在第十二届蓝桥杯大赛单片机设计与开发组获得省级一等奖和国家级二等奖&#xff0c;在第十五届嵌入式设计开发组获得省级二等奖。如果跟着本帖的流程备赛&#xff0c;只要认真勤奋&#xff0c;拿个省二绝对没问…

yolo标签自动标注(使用python和yolo方法)

yolo代码自动标注 1.引言1.初阶“自动标注”&#xff0c;给每个图像都生成一个固定的标注文件&#xff0c;进而在labglimg中对矩形框进行微调&#xff0c;减少标注的工作量2.高阶自动标注&#xff0c;利用我们训练好的&#xff08;但是没有特别精准的&#xff09;yolo文件先对每…

Git在版本控制中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Git在版本控制中的应用 Git在版本控制中的应用 Git在版本控制中的应用 引言 Git 概述 定义与原理 发展历程 Git 的关键技术 分布…

vue2.7.14 + vant + vue cli脚手架转vite启动运行问题记录

文章目录 前言方案一&#xff08;借用插件转换&#xff09;启动命令&#xff0c;转换方案一转换遇到的问题 方案二&#xff08;手动调整&#xff09;方案两者对比小结 前言 vue cli 脚手架转成vite启动 简单说说这个项目的一些底层基本结构哈&#xff0c;以及写这篇博客的目的…

边缘提取函数 [OPENCV--2]

OPENCV中最常用的边界检测是CANNY函数 下面展示它的用法 通常输入一个灰度图像&#xff08;边界一般和颜色无关&#xff09;这样也可以简化运算cv::Canny(inmat , outmat , therhold1, therhold2 ) 第一个参数是输入的灰度图像&#xff0c;第二个是输出的图像这两个参数都是引用…

SpringBoot基础系列学习(七):整合Mybatis

文章目录 一丶介绍1.基本信息2.特性 二丶代码1.项目结构2.数据表3.引入依赖4.实体类5.mapper6.sql.xml7.Controller8.结果 一丶介绍 1.基本信息 MyBatis 是一款优秀的持久层框架&#xff0c;它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手…

什么岗位需要学习 OpenGL ES ?说说 3.X 的新特性

什么是 OpenGL ES OpenGL ES 是一种为嵌入式系统和移动设备设计的3D图形API(应用程序编程接口)。它是标准 OpenGL 3D 图形库的一个子集,专门为资源受限的环境(如手机、平板电脑、游戏机和其他便携式设备)进行了优化。 由于其在移动设备上的广泛适用性,OpenGL ES是学习移…

记一次谷歌chrome浏览器 18 以上和 18 以下,最小字号不一致,导致的样式兼容问题解决过程

**记录一次谷歌chrome浏览器 18 以上和 18 以下&#xff0c;最小字号不一致&#xff0c;导致的样式兼容问题解决过程&#xff1a;** 定位问题尝试解决方案第一时间想到的解决方案&#xff1a;方案一尝试方案二&#xff1a;scale 缩放方案三&#xff1a;rem、em测试 方案四 SVG最…

Elasticsearch 和 Kibana 8.16:Kibana 获得上下文和 BBQ 速度并节省开支!

作者&#xff1a;来自 Elastic Platform Product Team Elastic Search AI 平台&#xff08;Elasticsearch、Kibana 和机器学习&#xff09;的 8.16 版本包含大量新功能&#xff0c;可提高性能、优化工作流程和简化数据管理。 使用更好的二进制量化 (Better Binary Quantizatio…