Qt Graphics View 绘图架构

Qt Graphics View 绘图架构

"QWGraphicsView.h" 头文件代码如下:

#pragma once

#include <QGraphicsView>

class QWGraphicsView : public QGraphicsView
{
	Q_OBJECT

public:
	QWGraphicsView(QWidget *parent);
	~QWGraphicsView();

protected:
	void mouseMoveEvent(QMouseEvent *event);
	void mousePressEvent(QMouseEvent *event);

signals:
	void mouseMovePoint(QPoint point);
	void mouseClicked(QPoint point);
};

mouseMoveEvent()是鼠标移动事件,代码如下:

//鼠标移动事件
void QWGraphicsView::mouseMoveEvent(QMouseEvent *event)
{
	QPoint point = event->pos();//QGraphicsView的坐标
	emit mouseMovePoint(point); //释放信号
	QGraphicsView::mouseMoveEvent(event);
}

       在此事件响应代码里,通过事件的pos()函数获取鼠标光标在视图中的坐标point,然后作为参数发射 mouseMovePoint(point)信号。这样,若在其他地方编写槽函数与此信号关联,就可以对鼠标移动事件作出响应。

mousePressEvent()是鼠标按键按下事件,代码如下:

//鼠标左键按下事件
void QWGraphicsView::mousePressEvent(QMouseEvent *event)
{
	if (event->button() == Qt::LeftButton)
	{
		QPoint point = event->pos();//QGraphicsView的坐标
		emit mouseClicked(point);//释放信号
	}
	QGraphicsView::mousePressEvent(event);
}

       在此事件响应代码里,首先判断是否是鼠标左键按下,然后通过事件的pos()函数获取鼠标光标在视图中的坐标point,然后作为参数发射mouseClicked(point)信号。

"sample8_4QGraphicsView.h"  头文件代码如下:

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_sample8_4QGraphicsView.h"

#include    <QGraphicsScene>
#include    <QLabel>


class sample8_4QGraphicsView : public QMainWindow
{
	Q_OBJECT

public:
	sample8_4QGraphicsView(QWidget *parent = Q_NULLPTR);

private:
	Ui::sample8_4QGraphicsViewClass ui;

protected:
	void resizeEvent(QResizeEvent *event);

private:
	QGraphicsScene  *scene;

	QLabel  *labViewCord;
	QLabel  *labSceneCord;
	QLabel  *labItemCord;

	void iniGraphicsSystem(); //创建Graphics View的各项

private slots:
	void on_mouseMovePoint(QPoint point);

	void on_mouseClicked(QPoint point);

};

#include "sample8_4QGraphicsView.h"

#include  "ui_sample8_4QGraphicsView.h"
#include   <QGraphicsEllipseItem>


//解决QT中中文显示乱码问题
#pragma execution_character_set("utf-8")


sample8_4QGraphicsView::sample8_4QGraphicsView(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);

	labViewCord = new QLabel("View 坐标:");
	labViewCord->setMinimumWidth(150);
	ui.statusBar->addWidget(labViewCord);

	labSceneCord = new QLabel("Scene 坐标:");
	labSceneCord->setMinimumWidth(150);
	ui.statusBar->addWidget(labSceneCord);

	labItemCord = new QLabel("Item 坐标:");
	labItemCord->setMinimumWidth(150);
	ui.statusBar->addWidget(labItemCord);

	ui.View->setCursor(Qt::CrossCursor);
	ui.View->setMouseTracking(true);
	ui.View->setDragMode(QGraphicsView::RubberBandDrag);

	QObject::connect(ui.View, SIGNAL(mouseMovePoint(QPoint)),
		this, SLOT(on_mouseMovePoint(QPoint)));

	QObject::connect(ui.View, SIGNAL(mouseClicked(QPoint)),
		this, SLOT(on_mouseClicked(QPoint)));

	iniGraphicsSystem();
}

鼠标移动事件响应:

//鼠标移动事件,point是 GraphicsView的坐标,物理坐标
void sample8_4QGraphicsView::on_mouseMovePoint(QPoint point)
{
	labViewCord->setText(QString::asprintf("View 坐标:%d,%d", point.x(), point.y()));
	QPointF pointScene = ui.View->mapToScene(point); //转换到Scene坐标
	labSceneCord->setText(QString::asprintf("Scene 坐标:%.0f,%.0f", pointScene.x(), pointScene.y()));
}

鼠标单击事件响应:

//鼠标单击事件
void sample8_4QGraphicsView::on_mouseClicked(QPoint point)
{
	QPointF pointScene = ui.View->mapToScene(point); //转换到Scene坐标
	QGraphicsItem  *item = NULL;
	item = scene->itemAt(pointScene, ui.View->transform()); //获取光标下的绘图项
	if (item != NULL) //有绘图项
	{
		QPointF pointItem = item->mapFromScene(pointScene); //转换为绘图项的局部坐标
		labItemCord->setText(QString::asprintf("Item 坐标:%.0f,%.0f", pointItem.x(), pointItem.y()));
	}
}

窗口变化大小时的事件:

//窗口变化大小时的事件
void sample8_4QGraphicsView::resizeEvent(QResizeEvent *event)
{ 
	Q_UNUSED(event);
	//Graphics View坐标,左上角总是(0,0),宽度=,长度=
	ui.labViewSize->setText(QString::asprintf("Graphics View坐标,左上角总是(0,0),宽度=%d,高度=%d",
		ui.View->width(), ui.View->height()));

	QRectF  rectF = ui.View->sceneRect(); //Scene的矩形区
	ui.LabSceneRect->setText(QString::asprintf("QGraphicsView::sceneRect=(Left,Top,Width,Height)=%.0f,%.0f,%.0f,%.0f",
		rectF.left(), rectF.top(), rectF.width(), rectF.height()));
}

构造Graphics View的各项:

//构造Graphics View的各项
void sample8_4QGraphicsView::iniGraphicsSystem()
{
	QRectF   rect(-200, -100, 400, 200);//左上角坐标,宽度,高度
	scene = new QGraphicsScene(rect); //scene逻辑坐标系定义
	ui.View->setScene(scene);


	//画一个矩形框,大小等于scene
	QGraphicsRectItem *item = new QGraphicsRectItem(rect); //矩形框正好等于scene的大小
	item->setFlags(QGraphicsItem::ItemIsSelectable     //可选,可以有焦点,但是不能移动
		| QGraphicsItem::ItemIsFocusable);
	QPen    pen;
	pen.setWidth(2);
	item->setPen(pen);
	//item->setPos(500,0);//缺省位置在scene的(0,0)
	scene->addItem(item);

	//一个位于scene中心的椭圆,测试局部坐标
	QGraphicsEllipseItem *item2 = new QGraphicsEllipseItem(-100, -50, 200, 100); //矩形框内创建椭圆,绘图项的局部坐标,左上角(-100,-50),宽200,高100
	item2->setPos(0, 0);//设置椭圆中心位置
	item2->setBrush(QBrush(Qt::blue));
	item2->setFlags(QGraphicsItem::ItemIsMovable //可移动
		| QGraphicsItem::ItemIsSelectable  //可选择
		| QGraphicsItem::ItemIsFocusable); //可获得焦点
	scene->addItem(item2);

	//一个圆,中心位于scene的边缘
	QGraphicsEllipseItem *item3 = new QGraphicsEllipseItem(-50, -50, 100, 100); //矩形框内创建椭圆,绘图项的局部坐标,左上角(-100,-50),宽200,高100
	item3->setPos(rect.right(), rect.bottom());//设置圆中心位置
	item3->setBrush(QBrush(Qt::red));
	item3->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable);
	scene->addItem(item3);

	scene->clearSelection();
	//item->setSelected(true);

	//ui.View->setDragMode(QGraphicsView::RubberBandDrag);
}

运行结果如下:

"QWGraphicsView.cpp" 文件代码如下:

#include "QWGraphicsView.h"

#include    <QMouseEvent>
#include    <QPoint>


QWGraphicsView::QWGraphicsView(QWidget *parent)
	: QGraphicsView(parent)
{
}

QWGraphicsView::~QWGraphicsView()
{
}

//鼠标移动事件
void QWGraphicsView::mouseMoveEvent(QMouseEvent *event)
{
	QPoint point = event->pos();//QGraphicsView的坐标
	emit mouseMovePoint(point); //释放信号
	QGraphicsView::mouseMoveEvent(event);
}

//鼠标左键按下事件
void QWGraphicsView::mousePressEvent(QMouseEvent *event)
{
	if (event->button() == Qt::LeftButton)
	{
		QPoint point = event->pos();//QGraphicsView的坐标
		emit mouseClicked(point);//释放信号
	}
	QGraphicsView::mousePressEvent(event);
}

"sample8_4QGraphicsView.cpp"  文件代码如下:

#include "sample8_4QGraphicsView.h"

#include  "ui_sample8_4QGraphicsView.h"
#include   <QGraphicsEllipseItem>


//解决QT中中文显示乱码问题
#pragma execution_character_set("utf-8")


sample8_4QGraphicsView::sample8_4QGraphicsView(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);

	labViewCord = new QLabel("View 坐标:");
	labViewCord->setMinimumWidth(150);
	ui.statusBar->addWidget(labViewCord);

	labSceneCord = new QLabel("Scene 坐标:");
	labSceneCord->setMinimumWidth(150);
	ui.statusBar->addWidget(labSceneCord);

	labItemCord = new QLabel("Item 坐标:");
	labItemCord->setMinimumWidth(150);
	ui.statusBar->addWidget(labItemCord);

	ui.View->setCursor(Qt::CrossCursor);
	ui.View->setMouseTracking(true);
	ui.View->setDragMode(QGraphicsView::RubberBandDrag);

	QObject::connect(ui.View, SIGNAL(mouseMovePoint(QPoint)),
		this, SLOT(on_mouseMovePoint(QPoint)));

	QObject::connect(ui.View, SIGNAL(mouseClicked(QPoint)),
		this, SLOT(on_mouseClicked(QPoint)));

	iniGraphicsSystem();
}

//鼠标移动事件,point是 GraphicsView的坐标,物理坐标
void sample8_4QGraphicsView::on_mouseMovePoint(QPoint point)
{
	labViewCord->setText(QString::asprintf("View 坐标:%d,%d", point.x(), point.y()));
	QPointF pointScene = ui.View->mapToScene(point); //转换到Scene坐标
	labSceneCord->setText(QString::asprintf("Scene 坐标:%.0f,%.0f", pointScene.x(), pointScene.y()));
}

//鼠标单击事件
void sample8_4QGraphicsView::on_mouseClicked(QPoint point)
{
	QPointF pointScene = ui.View->mapToScene(point); //转换到Scene坐标
	QGraphicsItem  *item = NULL;
	item = scene->itemAt(pointScene, ui.View->transform()); //获取光标下的绘图项
	if (item != NULL) //有绘图项
	{
		QPointF pointItem = item->mapFromScene(pointScene); //转换为绘图项的局部坐标
		labItemCord->setText(QString::asprintf("Item 坐标:%.0f,%.0f", pointItem.x(), pointItem.y()));
	}
}

//构造Graphics View的各项
void sample8_4QGraphicsView::iniGraphicsSystem()
{
	QRectF   rect(-200, -100, 400, 200);//左上角坐标,宽度,高度
	scene = new QGraphicsScene(rect); //scene逻辑坐标系定义
	ui.View->setScene(scene);


	//画一个矩形框,大小等于scene
	QGraphicsRectItem *item = new QGraphicsRectItem(rect); //矩形框正好等于scene的大小
	item->setFlags(QGraphicsItem::ItemIsSelectable     //可选,可以有焦点,但是不能移动
		| QGraphicsItem::ItemIsFocusable);
	QPen    pen;
	pen.setWidth(2);
	item->setPen(pen);
	//item->setPos(500,0);//缺省位置在scene的(0,0)
	scene->addItem(item);

	//一个位于scene中心的椭圆,测试局部坐标
	QGraphicsEllipseItem *item2 = new QGraphicsEllipseItem(-100, -50, 200, 100); //矩形框内创建椭圆,绘图项的局部坐标,左上角(-100,-50),宽200,高100
	item2->setPos(0, 0);//设置椭圆中心位置
	item2->setBrush(QBrush(Qt::blue));
	item2->setFlags(QGraphicsItem::ItemIsMovable //可移动
		| QGraphicsItem::ItemIsSelectable  //可选择
		| QGraphicsItem::ItemIsFocusable); //可获得焦点
	scene->addItem(item2);

	//一个圆,中心位于scene的边缘
	QGraphicsEllipseItem *item3 = new QGraphicsEllipseItem(-50, -50, 100, 100); //矩形框内创建椭圆,绘图项的局部坐标,左上角(-100,-50),宽200,高100
	item3->setPos(rect.right(), rect.bottom());//设置圆中心位置
	item3->setBrush(QBrush(Qt::red));
	item3->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable);
	scene->addItem(item3);

	scene->clearSelection();
	//item->setSelected(true);

	//ui.View->setDragMode(QGraphicsView::RubberBandDrag);
}

//窗口变化大小时的事件
void sample8_4QGraphicsView::resizeEvent(QResizeEvent *event)
{ 
	Q_UNUSED(event);
	//Graphics View坐标,左上角总是(0,0),宽度=,长度=
	ui.labViewSize->setText(QString::asprintf("Graphics View坐标,左上角总是(0,0),宽度=%d,高度=%d",
		ui.View->width(), ui.View->height()));

	QRectF  rectF = ui.View->sceneRect(); //Scene的矩形区
	ui.LabSceneRect->setText(QString::asprintf("QGraphicsView::sceneRect=(Left,Top,Width,Height)=%.0f,%.0f,%.0f,%.0f",
		rectF.left(), rectF.top(), rectF.width(), rectF.height()));
}

"main.cpp"  文件代码如下:

#include "sample8_4QGraphicsView.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	sample8_4QGraphicsView w;
	w.show();
	return a.exec();
}

《Qt5/6 C++开发指南》

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

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

相关文章

获 2023 年度浙江省科学技术进步奖一等奖 | 网易数智日报

11 月 22 日&#xff0c;加快建设创新浙江因地制宜发展新质生产力动员部署会暨全省科学技术奖励大会在杭州隆重召开。浙江大学、网易数智等单位联合研发的“大规模结构化数据智能计算平台及产业化”项目获得 2023 年度浙江省科学技术进步奖一等奖。 加快建设创新浙江因地制宜发…

C++笔记之构造函数声明只需要写明需要的参数,不需要列出所有成员变量、可以使用成员初始化列表初始化所有需要的成员变量

C++笔记之构造函数声明只需要写明需要的参数,不需要列出所有成员变量、可以使用成员初始化列表初始化所有需要的成员变量 参考笔记 C++新特性探究(七):初始化列表(Initialization List) C++之关于初始化列表(Initialization List)的一个补充示例 C++笔记之构造函数声明只需要…

Element UI 打包探索【1】

目录 第一个命令 第二个命令 node build/bin/iconInit.js node build/bin/build-entry.js node build/bin/i18n.js node build/bin/version.js 总结 最近在接触组件库的项目&#xff0c;所以特意拿来Element UI借鉴学习一下&#xff0c;它算是做前端的同学们离不开的一…

使用Setup Factory将C#的程序打包成安装包

一、软件下载 https://download.csdn.net/download/qq_65356682/90042701 可以直接下载 二、软件使用 打开 1、创建一个新的项目 2、设置如下信息&#xff0c;也可以不设置&#xff0c;最好填非空的、 产品名就是你安装成功后生成文件的名称 3、如下文件夹路径就是你C#中ex…

QT实现拷贝复制文件操作 QT5.12.3环境 C++实现

案例需求&#xff1a;利用QT线程操作&#xff0c;实现拷贝复制文件操作 代码&#xff1a; myfile.h #ifndef MYFILE_H #define MYFILE_H#include <QObject> #include <QDebug> #include <QThread> #include <QFile> #include <QtWidgets> class…

vue 富文本图片如何拖拽

在Vue项目中实现富文本编辑器&#xff08;如vue-quill-editor&#xff09;的图片拖拽功能&#xff0c;需要结合Quill.js及其相关插件进行配置 安装必要的依赖包&#xff1a; 你需要安装vue-quill-editor作为富文本编辑器的基础组件。为了支持图片拖拽功能&#xff0c;你还需要…

Python基础学习-11函数参数

1、"值传递” 和“引用传递” 1&#xff09;不可变的参数通过“值传递”。比如整数、字符串等 2&#xff09;可变的参数通过“引用参数”。比如列表、字典。 3&#xff09;避免可变参数的修改 4&#xff09;内存模型简介 2、函数参数类型 1&#xff09; def func() #无参…

41_GAN网络详解(1)

生成对抗网络&#xff08;Generative Adversarial Network&#xff0c;简称GAN&#xff09;是一种深度学习模型&#xff0c;提出于2014年&#xff0c;由Ian Goodfellow及其团队提出。GAN通过对抗训练的方式&#xff0c;利用两个神经网络模型进行协作&#xff0c;达到生成高质量…

Top 10 Tools to Level Up Your Prompt Engineering Skills

此文章文字是转载翻译&#xff0c;图片是自已用AI 重新生成的。文字内容来自 https://www.aifire.co/p/top-10-ai-prompt-engineering-tools 供记录学习使用。 Introduction to AI Prompt Engineering AI Prompt Engineering 简介 1&#xff0c;Prompt Engineering 提示工程…

Redis设计与实现 学习笔记 第二十章 Lua脚本

Redis从2.6版本引入对Lua脚本的支持&#xff0c;通过在服务器中嵌入Lua环境&#xff0c;Redis客户端可以使用Lua脚本&#xff0c;直接在服务器端原子地执行多个Redis命令。 其中EVAL命令可以直接对输入的脚本进行求值&#xff1a; 而使用EVALSHA命令则可以根据脚本的SHA1校验…

【人工智能】Python常用库-Scikit-learn常用方法教程

Scikit-learn 是一个功能强大的机器学习库&#xff0c;支持数据预处理、分类、回归、聚类、降维等功能&#xff0c;广泛用于模型开发与评估。以下是 Scikit-learn 的常用方法及详细说明。 1. 安装与导入 安装 Scikit-learn&#xff1a; pip install scikit-learn导入基本模块…

模糊逻辑学习 | 模糊推理 | 模糊逻辑控制

注&#xff1a;本文为几位功夫博主关于 “模糊逻辑学习 / 推理 / 控制” 的相关几篇文章合辑。 初学模糊逻辑控制&#xff08;Fuzzy Logic Control&#xff09; ziqian__ 已于 2022-08-19 20:30:25 修改 一、前言 模糊逻辑控制&#xff08;Fuzzy Logic Control&#xff09;是…

mvn-mac操作小记

1.安装brew 如果报错&#xff0c;Warning: /opt/homebrew/bin is not in your PATH. vim ~/.zshrc&#xff0c;最后一行追加 export PATH“/opt/homebrew/bin:$PATH” source ~/.zshrc 2.安装brew install maven mvn -version查看路径 Maven home: /opt/homebrew/Cellar/mav…

SAP开发语言ABAP开发入门

1. 了解ABAP开发环境和基础知识 - ABAP简介 - ABAP&#xff08;Advanced Business Application Programming&#xff09;是SAP系统中的编程语言&#xff0c;主要用于开发企业级的业务应用程序&#xff0c;如财务、物流、人力资源等模块的定制开发。 - 开发环境搭建 - 首先需…

英语知识网站开发:Spring Boot框架应用

3系统分析 3.1可行性分析 通过对本英语知识应用网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本英语知识应用网站采用SSM框架&#xff0c;JAVA作为开发语…

非协议默认端口的:NAT alg需配置port-mapping

参考解释文章&#xff1a; https://zhiliao.h3c.com/Theme/details/167990 https://zhiliao.h3c.com/Theme/details/44359 nat的alg和port-mapping - 知了社区 NAT alg的功能 NAT ALG&#xff08;Application Level Gateway&#xff0c;应用层网关&#xff09;主要完成对应用…

三六零[601360]行情数据接口

1、三六零&#xff1a;实时行情 Restful API # 测试接口&#xff1a;可以复制到浏览器打开 https://tsanghi.com/api/fin/stock/XSHG/realtime?tokendemo&ticker601360获取股票实时行情&#xff08;开、高、低、收、量&#xff09;。 请求方式&#xff1a;GET。 Python示例…

Xilinx Blockset Gateway In 和Gateway out模块使用及参数配置

目录 一、Gateway InSimulink数据到System Generator数据的转换Gateway BlocksBlock Parameters&#xff08;模块参数&#xff09;Basic选项卡参数Implementation选项卡参数 二、Gateway OutGateway BlocksBlock Parameters&#xff08;模块参数&#xff09;Basic选项卡参数Imp…

三格电子—EtherNet IP转Modbus RTU网关

EtherNet/IP转Modbus RTU网关 SG-EIP-MOD-210 产品用途 SG-EIP-MOD-210网关可以实现将Modbus接口设备连接到 EtherNet/IP网络中。用户不需要了解具体的Modbus和 EtherNet/IP协议即可实现将Modbus设备挂载到 EtherNet/IP接口的PLC上&#xff0c;并和Modbus设备进行数据交互。拓…

使用 Jina Embeddings v2 在 Elasticsearch 中进行后期分块

作者&#xff1a;来自 Elastic Gustavo Llermaly 在 Elasticsearch 中使用 Jina Embeddings v2 模型并探索长上下文嵌入模型的优缺点。 在本文中&#xff0c;我们将配置和使用 jina-embeddings-v2&#xff0c;这是第一个开源 8K 上下文长度嵌入模型&#xff0c;首先使用 semant…