Qt中绘图框架的使用例子

绘图框架的使用步骤:

1、创建自定类继承QGraphicsView(可以直接用QGraphicsView小部件)。

2、创建QGraphicsScene对象,在创建的时候初始化场景矩形框。并使用QGraphicsView部件的函数setScene将场景设置到视图中,这里小编测试不能再视图中放置多个场景,后面设置的场景会将之前的场景覆盖。但是一个场景可以设置给多个视图。

3、使用QGraphicsItem的子类图形或者自定义继承QGraphicsItem的图形项创建对象,可以使用到QPen、QBrush等相关绘图类进行渲染,之后通过QGraphicsScene的函数addItem()将其设置到场景中。至此简单的绘图框架绘制完成。

绘图框架中视图、场景和图形项位置坐标的对应关系(小编自己总结的)

当在视图中创建场景时,场景的坐标范围为场景矩形框的顶点加上长宽,例如在视图中添加一个场景矩形框为(-100,100,200,200)那么场景区域的左上角坐标为(-100,100),宽度为200,高度为200,也就是说视图的坐标范围为(-100,100)和(100,300),而对应的坐标原点(0,0)不在此范围之内。而场景和视图的对应关系是中心的对齐(通俗点就是视图的中心点和场景的中心点事重合的)。

当在场景中创建图形项的时候,图形项的位置有两种表示:

不设置setpos()坐标,这个时候会默认和场景中的坐标对应,也就是说这种情况下图形项的坐标和场景中的坐标是一一对应的。而图形项中坐标的范围就是图形项设置的矩形框顶点加上长宽(有可能(0,0)也不在这个范围之中)。但是一般情况下载创建图形项的时候会将(0,0)点设置为图形项的中心点。

设置setpos()函数,这个时候图形项的位置将会相对偏移setpos()函数设置的量,因此当设置了setpos()之后,场景和图形项之间就会从在一定的偏移量。

代码如下:

1、自定义的视图类

#ifndef MYGRAPHICSVIEW_H
#define MYGRAPHICSVIEW_H#include <QGraphicsView>
#include <QPoint>
#include <QMouseEvent>
class MyGraphicsView : public QGraphicsView
{Q_OBJECT
public:MyGraphicsView(QWidget *parent = 0);protected:void mouseMoveEvent(QMouseEvent *event);void mousePressEvent(QMouseEvent *event);signals:void mouseMovePoint(QPoint point);void mouseClicked(QPoint point);};#endif // MYGRAPHICSVIEW_H
#include "mygraphicsview.h"MyGraphicsView::MyGraphicsView(QWidget *parent)
{}void MyGraphicsView::mouseMoveEvent(QMouseEvent *event)
{QPoint point = event->pos();emit mouseMovePoint(point);QGraphicsView::mouseMoveEvent(event);
}void MyGraphicsView::mousePressEvent(QMouseEvent *event)
{if(event->button() == Qt::LeftButton){QPoint point = event->pos();emit mouseClicked(point);}QGraphicsView::mousePressEvent(event);
}

2、创建场景和图形项

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QGraphicsScene>
#include "mygraphicsview.h"
#include <QGraphicsItem>
#include <QRectF>
#include <QPen>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();
private:Ui::MainWindow *ui;private:QGraphicsScene* scene;QGraphicsScene* scene1;void initGraphicsSystem();//创建Graphics View各项protected:void resizeEvent(QResizeEvent *event);private slots:void mouseMovePoint(QPoint point);void mouseCliched(QPoint point);
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);ui->graphicsView->setCursor(Qt::CrossCursor);ui->graphicsView->setMouseTracking(true);ui->graphicsView->setDragMode(QGraphicsView::RubberBandDrag);QObject::connect(ui->graphicsView,&MyGraphicsView::mouseMovePoint,this,&MainWindow::mouseMovePoint);QObject::connect(ui->graphicsView,&MyGraphicsView::mouseClicked,this,&MainWindow::mouseCliched);initGraphicsSystem();}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::initGraphicsSystem()
{QRectF rect(-200,-100,400,200);scene = new QGraphicsScene(rect);//scene 逻辑坐标系定义ui->graphicsView->setScene(scene);ui->graphicsView_2->setScene(scene);//画框QGraphicsRectItem *item = new QGraphicsRectItem(rect);item->setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsFocusable);QPen pen;pen.setWidth(2);item->setPen(pen);scene->addItem(item);//画框QGraphicsRectItem *item1 = new QGraphicsRectItem(-100,-50,200,100);item1->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsFocusable);item1->setPen(pen);scene->addItem(item1);scene->clearSelection();}void MainWindow::resizeEvent(QResizeEvent *event)
{}void MainWindow::mouseMovePoint(QPoint point)
{ui->label_view->setText(QString::asprintf("view 坐标 %d,%d",point.x(),point.y()));QPointF pointscene = ui->graphicsView->mapToScene(point);ui->label_sence->setText(QString::asprintf("scene 坐标 %0.f,%0.f",pointscene.x(),pointscene.y()));
}void MainWindow::mouseCliched(QPoint point)
{QPointF pointscene = ui->graphicsView->mapToScene(point);QGraphicsItem *item = nullptr;item = scene->itemAt(pointscene,ui->graphicsView->transform());//获取光标下的图形if(item != nullptr){QPointF pointItem = item->mapFromScene(pointscene);//图形项局部坐标ui->label_item->setText(QString::asprintf("item 坐标 %0.f,%0.f",pointItem.x(),pointItem.y()));}
}

缩放

//旋转
void MainWindow::on_pushButton_3_clicked()
{item1->setRotation(100);//设置旋转角度item1->rotation();//开始旋转
}
//缩放
void MainWindow::on_pushButton_2_clicked()
{item1->setScale(1.2);//设置缩放系数item1->scale();//开始缩放
}

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

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

相关文章

SpringBoot2.x简单集成Flowable

环境和版本 window10 java1.8 mysql8 flowable6 springboot 2.7.6 配置 使用IDEA创建一个SpringBoot项目 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.…

远程开户身份证识别OCR技术:革新传统流程,实现高效身份验证

远程开户是指通过互联网或其他远程通信方式&#xff0c;不需要亲自前往银行、证券公司或其他金融机构的实体营业网点&#xff0c;即可完成开立账户和办理相关服务的过程。 相比传统柜台开户方式&#xff0c;远程开户具有更高的便利性和灵活性。它使得用户可以随时随地通过网络…

API学习总结

目录 文本朗读语音识别API 语音合成语法 语音合成示例 语音识别语法 语音识别示例 文本朗读语音识别API Web Speech API有两个功能&#xff1a;用于在浏览器中实现语音识别&#xff08;将人声转换为文本&#xff09;和语音合成&#xff08;将文本转换为人声&#xff09…

基于PHP的创意设计分享系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

可道云kodbox上传出错解决办法

上传出错,服务器限制或配置异常: 出错了! (warning!) fseek(): Argument #1 ($stream) must be of type resource, bool given 系统错误 function/file.function.php[138] fseek() function/file.function.php[138] [Windows NT 10.0/8.2.4/mysqli/1.44.07] 主要是由于服务…

MySQL用户权限管理

目录 用户是如何定义的mysq的权限级别介绍用户查看用户创建用户删除用户授权回收用户权限1、用户是如何定义的 一个典型的MySQL用户名@主机的格式应该是这样的:username@hostname,其中username表示用户名,hostname表示主机名或IP地址。 hostname包含了多种格式: 10.0.0.5…

【故障诊断】用于轴承故障诊断的候选故障频率优化克改进包络频谱研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

微信小程序完整项目实战(前端+后端)

基于微信小程序的在线商城点单系统 前言&#xff1a;闲来无事&#xff0c;想以后自己开一个小超市或者小吃店&#xff0c;能够支持线上下单&#xff0c;既方便客户也方便自己。系统采用Java语言作为后端实现与小程序的交互&#xff0c;给用来学习或者想自己开个小店的朋友当个参…

在亚马逊云科技Amazon SageMaker上进行Stable Diffusion模型训练和推理

Stable Diffusion Quick Kit是一个基于亚马逊云科技Amazon SageMaker进行Stable Diffusion模型快速部署的工具包&#xff0c;包括了一组示例代码、服务部署脚本、前端UI&#xff0c;可以帮助可以快速部署一套Stable Diffusion的原型服务。 本文将介绍如何在SageMaker Training …

2530. 执行 K 次操作后的最大分数

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你的 起始分数 为 0 。 在一步 操作 中&#xff1a; 选出一个满足 0 < i < nums.length 的下标 i &#xff0c; 将你的 分数 增加 nums[i] &#xff0c;并且 将 nums[i] 替换为 ceil(nums[i] / 3) 。 返回在 恰好…

服务器中了mkp勒索病毒怎么处理,mkp勒索病毒解密,数据恢复

10月份以来&#xff0c;云天数据恢复中心陆续接到很多企业的求助&#xff0c;企业的服务器遭到了mkp勒索病毒攻击&#xff0c;导致企业的服务器数据库被加密&#xff0c;严重影响了企业工作&#xff0c;通过这一波mkp勒索病毒的攻击&#xff0c;云天数据恢复工程师为大家总结了…

【AI视野·今日Sound 声学论文速览 第二十六期】Mon, 16 Oct 2023

AI视野今日CS.Sound 声学论文速览 Mon, 16 Oct 2023 Totally 7 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Low-latency Speech Enhancement via Speech Token Generation Authors Huaying Xue, Xiulian Peng, Yan Lu现有的基于深度学习的语音增强…

力扣第90题 子集|| 去重问题 c++ 注释版

题目 90. 子集 II 中等 相关标签 位运算 数组 回溯 给你一个整数数组 nums &#xff0c;其中可能包含重复元素&#xff0c;请你返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。返回的解集中&#xff0c;子集可以按 任意顺序 排列…

中文编程开发语言工具开发的实际软件案例:称重管理系统软件

中文编程开发语言工具开发的实际软件案例&#xff1a;称重管理系统软件 中文编程开发语言工具开发的实际软件案例&#xff1a;称重管理系统软件&#xff0c;软件可以安装在电脑上&#xff0c;也可以安装在收银机上&#xff0c;支持触摸和鼠标点&#xff0c;想学编程可以关注系统…

【web前端】web前端设计入门到实战第一弹——html基础精华

前端 一&#xff1a;图片属性二&#xff1a;音频标签三&#xff1a; 视频标签四&#xff1a;链接标签五&#xff1a;列表标签5.1.无序列表5.2.有序列表3.自定义列表 六&#xff1a;表格6.1合并单元格 七&#xff1a;input标签八&#xff1a;select系列九&#xff1a; 文本域标签…

《软件方法》2023版第1章(10)应用UML的建模工作流-大图

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 1.4 应用UML的建模工作流 1.4.1 概念 我用类图表示建模工作流相关概念如图1-16。 图1-16 建模工作流相关概念 图1-16左侧灰色部分定义了“游戏规则”&#xff0c;右侧则是在“游戏规…

Canvas绘图学习笔记:画笔的路径与状态

beginPath beginPath表示开始一个路径&#xff0c;我们在上一章画弧的时候用到过好多次&#xff0c;他的API非常简单&#xff1a; context.beginPath(); 开始路径有2层意思&#xff0c;一个就是本次绘制的起点是新的&#xff08;不再是上次结束的点了&#xff09;&#xff0…

2021-9-25 美团售后服务系统后端一面【2024秋招】

1 实习 1.1 讲讲你做的一个需求&#xff0c;为什么这么做之类的 答&#xff1a; 1.2 什么是接线 1.3 什么的初始接线&#xff0c;和权威接线 答&#xff1a;初始接线是现状&#xff0c;权威是规划中的 1.4 为什么要做比较呢&#xff1f; 答&#xff1a;运维人员需要查看…

强大的下载管理器:Progressive Downloader for Mac

Progressive Downloader for Mac是一种强大的下载管理器&#xff0c;它可以帮助用户更快速、更稳定地下载文件。相比于其他下载工具&#xff0c;PD下载管理器具有很多独特的功能和优势&#xff0c;本文将对其进行详细推广。 在数字化时代&#xff0c;下载已成为我们日常工作中必…

pdf压缩文件怎么压缩最小?

pdf压缩文件怎么压缩最小&#xff1f;我们很多项目介绍或是学术的报告都是采用的这个pdf格式&#xff0c;那么我们在存储或是需要进行分享的时候&#xff0c;可能就会因为文件过大而导致无法打开或是发送了。那么就需要将其进行压缩。PDF文件压缩方法很多&#xff0c;pdf压缩文…