![image-20220505144510057](QT5 使用.assets/image-20220505144510057.png)

三者关系:View中可以有多个Scene,Scene放在View中,Scene可以装多个Item图形

若要实现鼠标事件,则需要重写QGraphicsView

MyGraphicsView.h

#ifndef MYGRAPHICSVIEW_H
#define MYGRAPHICSVIEW_H #include <QGraphicsView>
#include <QMouseEvent> class MyGraphicsView : public QGraphicsView
{
Q_OBJECT
public:
explicit MyGraphicsView(QWidget *parent = nullptr); signals:
void mouseMoveEvent(QPoint point);//发送鼠标事件
void mouseClickEvent(QPoint point); // QWidget interface
protected:
void mouseMoveEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override; }; #endif // MYGRAPHICSVIEW_H

MyGraphicsView.cpp

窗口#include "mygraphicsview.h"

MyGraphicsView::MyGraphicsView(QWidget *parent) : QGraphicsView(parent)
{ } void MyGraphicsView::mouseMoveEvent(QMouseEvent *event)
{
emit(mouseMoveEvent(event->pos()));
QGraphicsView::mouseMoveEvent(event);
} void MyGraphicsView::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
emit(mouseClickEvent(event->pos()));
}
QGraphicsView::mouseReleaseEvent(event);
}

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H #include <QGraphicsScene>
#include <QMainWindow> QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE class MainWindow : public QMainWindow
{
Q_OBJECT public:
MainWindow(QWidget *parent = nullptr);
~MainWindow(); private:
Ui::MainWindow *ui; QGraphicsScene *graphicsScene;//场景 void initGraphicsView(); private slots:
void onMouseMove(QPoint point);
void onMouseClick(QPoint point); // QWidget interface
protected:
void resizeEvent(QResizeEvent *event) override;
};
#endif // MAINWINDOW_H

MainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h" #include <QGraphicsRectItem> MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this); ui->graphicsView->setCursor(Qt::CrossCursor);
ui->graphicsView->setMouseTracking(true); initGraphicsView(); connect(ui->graphicsView, SIGNAL(mouseMoveEvent(QPoint)), this, SLOT(onMouseMove(QPoint)));
connect(ui->graphicsView, SIGNAL(mouseClickEvent(QPoint)), this, SLOT(onMouseClick(QPoint)));
} MainWindow::~MainWindow()
{
delete ui;
} void MainWindow::initGraphicsView()
{
QRectF rect = QRectF(-200, -100, 400, 200);
graphicsScene = new QGraphicsScene(rect);
ui->graphicsView->setScene(graphicsScene);//设置场景 QPen pen;
pen.setWidth(2);
pen.setStyle(Qt::SolidLine); QBrush brush;
brush.setColor(QColor(100, 200, 150, 150));
brush.setStyle(Qt::CrossPattern); QGraphicsRectItem *item = new QGraphicsRectItem(rect);//画矩形
item->setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable);
item->setPen(pen);
graphicsScene->addItem(item); QGraphicsEllipseItem *ellipseItem = new QGraphicsEllipseItem(-100, -50, 200, 100);//椭圆
ellipseItem->setPen(pen);
ellipseItem->setBrush(brush);
ellipseItem->setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable);
graphicsScene->addItem(ellipseItem); QGraphicsEllipseItem *circleItem = new QGraphicsEllipseItem(-50, -50, 100, 100);//圆
circleItem->setPos(200, 100);
circleItem->setPen(pen);
brush.setStyle(Qt::SolidPattern);
circleItem->setBrush(brush);
circleItem->setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemIsMovable);//可选 | 可聚焦 | 可点击后移动(拖拽)
graphicsScene->addItem(circleItem);
} void MainWindow::onMouseMove(QPoint point)
{
QPointF scenePoint = ui->graphicsView->mapToScene(point);//graphicsView映射到scene的坐标
QString info = QString::asprintf("View坐标:(%d , %d); Scene坐标:(%.0f , %.0f)", point.x(), point.y(), scenePoint.x(), scenePoint.y());
ui->statusbar->showMessage(info);
} void MainWindow::onMouseClick(QPoint point)
{
QPointF scenePoint = ui->graphicsView->mapToScene(point);
QGraphicsItem *item = nullptr;
item = graphicsScene->itemAt(scenePoint, ui->graphicsView->transform());
if (item != nullptr) {
QPointF itemPoint = item->mapFromScene(scenePoint);//求当前点击位置相对于当前图元的坐标,图元中心为原点
QString message = ui->statusbar->currentMessage() + QString::asprintf("; Item 坐标:(%.0f , %.0f)", itemPoint.x(), itemPoint.y());
ui->statusbar->showMessage(message);
}
} void MainWindow::resizeEvent(QResizeEvent *event)
{
QString graphicsStr = ui->label->text();
QString sceneStr = ui->label_2->text(); int w = ui->graphicsView->width();
int h = ui->graphicsView->height();
ui->label->setText(QString::asprintf("Graphics View坐标,左上角总是(0,0),宽度= %d,长度= %d", w, h)); QRectF rect = this->graphicsScene->sceneRect();
ui->label_2->setText(QString::asprintf("QGraphicsView::sceneRect=(%.0f, %.0f, %.0f, %.0f)", rect.x(), rect.y(), rect.width(), rect.height()));
}

界面:

QT5笔记: 35. QGraphicsView 视图的更多相关文章

  1. Spring实战第六章学习笔记————渲染Web视图

    Spring实战第六章学习笔记----渲染Web视图 理解视图解析 在之前所编写的控制器方法都没有直接产生浏览器所需的HTML.这些方法只是将一些数据传入到模型中然后再将模型传递给一个用来渲染的视图. ...

  2. leetcode笔记——35.搜索插入位置 - CrowFea

    0.问题描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 12 输入: [1,3 ...

  3. asp.net core mvc视频A:笔记3-5.视图数据共享之TempData

    前几节讲的都是单页面数据共享,从本节开始讲跨页面数据共享 创建项目3.5,新建控制器 代码 控制器 设置TempData 另一个视图中读取TempData数据 运行 此时如果刷新页面,页面中的内容“张 ...

  4. Django笔记&教程 2-3 视图(view)函数介绍

    Django 自学笔记兼学习教程第2章第3节--视图(view)函数介绍 点击查看教程总目录 参考文献:https://docs.djangoproject.com/en/2.2/topics/htt ...

  5. Django笔记&教程 2-4 视图常用

    Django 自学笔记兼学习教程第2章第4节--视图常用 点击查看教程总目录 1 - shortcut 视图函数需要返回一个HttpResponse对象或者其子类对象. 不过很多时候直接手写建立一个H ...

  6. Leetcode 笔记 35 - Valid Soduko

    题目链接:Valid Sudoku | LeetCode OJ Determine if a Sudoku is valid, according to: Sudoku Puzzles - The R ...

  7. OpenGL学习笔记4——模型视图变换

    以日月地为例的一个模型视图变换.绕了比较多的弯路,下面是几个注意点总结. 注意点: 1.GL函数对模型的操作是基于当前局部坐标系,即模型坐标系而非世界坐标系,二者只在第一次初始化完毕之后才重合: 2. ...

  8. MySQL学习笔记——索引和视图

    索引(index)和管理索引 模式中的一个数据库对象 作用:在数据库中用来加速对表的查询 创建:自动在主键和唯一键上面创建索引 通过使用快速路径访问方法快速定位数据,减少了磁盘的I/O 与表独立存放, ...

  9. 《BI项目笔记》数据源视图设置

    目的数据源视图是物理源数据库和分析维度与多维数据集之间的逻辑数据模型.在创建数据源视图时,需要在源数据库中指定包含创建维度和多维数据集所需要的数据表格和视图.BIDS与数据库连接,读取表格和视图定义, ...

  10. [terry笔记]物化视图 materialized view基础学习

    一.物化视图定义摘录:     物化视图是包括一个查询结果的数据库对像(由系统实现定期刷新数据),物化视图不是在使用时才读取,而是预先计算并保存表连接或聚集等耗时较多的操作结果,这样在查询时大大提高了 ...

随机推荐

  1. IO介绍-下

    中断 由外部设备引起的中断,称为外中断. 由内部错误引起的中断,称为内中断,或者是陷入.例如:非法指令,地址越界,电源故障等.   中断向量表 中断优先级 多中断源的处理方式 屏蔽中断 嵌套中断 根据 ...

  2. openEuler欧拉系统重置root密码

    步骤: 系统启动时,出现如下页面,按e进入内核编辑模式 进入如下页面 按下光标后,找到linux开头这一行,修改ro为rw,并在行尾添加init=/bin/sh,修改后效果如下,在crtl+x保存后开 ...

  3. IOS热重载工具InjectionIII

    IOS热重载工具InjectionIII 支持 OC.Swift 以及 Swift 和 OC 混编项目的 UI 热重载工具,采取在模拟器(真机不支持)注入方式实现 UI 热重载,修改完 UI 直接 c ...

  4. 【前端】【探究】HTML - input类型为file时如何实现自定义文本以更好的美化

    想到英语四级考了两次都没过,我觉得要多使用英文,所以本文使用英文书写. 本文讲述了遇到的问题,解决的思路,并讲述了解决方案,也许对你会有帮助. 目录 Problem description Solut ...

  5. 【Java高级编程】IO流学习笔记

    目录 IO流 File类 文件/文件夹基础操作 创建文件的完整步骤 IO流 - 节点流 读入文件一个字节(一个字节) [FileInputStream]字节数组的方式读取(读取全部内容) [FileI ...

  6. 将现有的系统环境文件打包成Docker镜像文件

    一.现有A系统Centos7操作: 备注:A系统里最好不安装Docker,否则会报错 卸载不必要软件包 yum remove -y iwl* *firmware* --exclude=kernel-f ...

  7. LetsTalk_Android中引导用户加入白名单图

    --------------------------------

  8. 解决STM32 CubeMX中配置RTC每次上电就会重置的问题

    自从有了Cube MX,配置STM32的外设就变得格外简单.不过这次差点踩坑,下载完程序后RTC自动就恢复到了我设置的初始值,重启之后现象依旧. 下面就以上问题简单分析一下代码. /* RTC ini ...

  9. salesforce零基础学习(一百四十二)在Formula字段中如何通过Datetime字段显示Local Time(适配DST)

    背景: 我们需求是显示Date Time类型的Time信息,比如我们想要在report中基于Hour Of Created Date进行分组,从而想要了解到一段时间内什么时间是数据创建的高峰期,不同的 ...

  10. 记一次 contentInsetAdjustmentBehavior 引发的bug

    注:本文同步发布于微信公众号:stringwu的互联网杂谈记一次 contentInsetAdjustmentBehavior 引发的bug 1 背景 项目中使用到了UILable来展示相关的文本内容 ...