QT5笔记: 35. QGraphicsView 视图

三者关系: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 视图的更多相关文章
- Spring实战第六章学习笔记————渲染Web视图
Spring实战第六章学习笔记----渲染Web视图 理解视图解析 在之前所编写的控制器方法都没有直接产生浏览器所需的HTML.这些方法只是将一些数据传入到模型中然后再将模型传递给一个用来渲染的视图. ...
- leetcode笔记——35.搜索插入位置 - CrowFea
0.问题描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 12 输入: [1,3 ...
- asp.net core mvc视频A:笔记3-5.视图数据共享之TempData
前几节讲的都是单页面数据共享,从本节开始讲跨页面数据共享 创建项目3.5,新建控制器 代码 控制器 设置TempData 另一个视图中读取TempData数据 运行 此时如果刷新页面,页面中的内容“张 ...
- Django笔记&教程 2-3 视图(view)函数介绍
Django 自学笔记兼学习教程第2章第3节--视图(view)函数介绍 点击查看教程总目录 参考文献:https://docs.djangoproject.com/en/2.2/topics/htt ...
- Django笔记&教程 2-4 视图常用
Django 自学笔记兼学习教程第2章第4节--视图常用 点击查看教程总目录 1 - shortcut 视图函数需要返回一个HttpResponse对象或者其子类对象. 不过很多时候直接手写建立一个H ...
- Leetcode 笔记 35 - Valid Soduko
题目链接:Valid Sudoku | LeetCode OJ Determine if a Sudoku is valid, according to: Sudoku Puzzles - The R ...
- OpenGL学习笔记4——模型视图变换
以日月地为例的一个模型视图变换.绕了比较多的弯路,下面是几个注意点总结. 注意点: 1.GL函数对模型的操作是基于当前局部坐标系,即模型坐标系而非世界坐标系,二者只在第一次初始化完毕之后才重合: 2. ...
- MySQL学习笔记——索引和视图
索引(index)和管理索引 模式中的一个数据库对象 作用:在数据库中用来加速对表的查询 创建:自动在主键和唯一键上面创建索引 通过使用快速路径访问方法快速定位数据,减少了磁盘的I/O 与表独立存放, ...
- 《BI项目笔记》数据源视图设置
目的数据源视图是物理源数据库和分析维度与多维数据集之间的逻辑数据模型.在创建数据源视图时,需要在源数据库中指定包含创建维度和多维数据集所需要的数据表格和视图.BIDS与数据库连接,读取表格和视图定义, ...
- [terry笔记]物化视图 materialized view基础学习
一.物化视图定义摘录: 物化视图是包括一个查询结果的数据库对像(由系统实现定期刷新数据),物化视图不是在使用时才读取,而是预先计算并保存表连接或聚集等耗时较多的操作结果,这样在查询时大大提高了 ...
随机推荐
- 痞子衡嵌入式:i.MXRT1170上PXP对CM7 TCM进行随机地址短小数据写入操作限制
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1170上PXP对CM7 TCM进行随机地址短小数据写入操作限制. 在 MCU 里能够对片内外映射的存储器进行读写操作的主设 ...
- ChatGPT生成测试用例的最佳实践(二)
这种测试用例还不够直观,能不能让其以表格的形式显示呢?笔者输入"请以表格形式展示,谢谢."提示词,ChatGPT输出的部分内容如图3-3所示. 图3-3 ChatGPT输出的部分 ...
- sqlserver查询某数据库下表的占用空间
要查看 SQL Server 中哪个表占用的空间最多,您可以使用以下查询来列出所有表及其占用的空间大小,并按照占用空间从大到小进行排序: SELECT t.NAME AS TableName, p.r ...
- TokenService
https://github.com/ng-alain/delon/blob/master/packages/auth/src/token/token.service.ts set(data: ITo ...
- eShopOnContainer 中 Grpc 服务定义与实现
eShopOnContainer 中 Grpc 服务定义与实现 服务于前端的后端 (BFF) 模式是 API 网关模式的一种变形,针对外部使用者的不同需求,为每种不同的客户端使用者提供一种后端 API ...
- Golang实战:深入解析国密算法在Go语言中的应用与优化
Golang实战:深入解析国密算法在Go语言中的应用与优化 引言 随着信息技术的迅猛发展,数据安全成为企业和个人关注的焦点.国密算法(SM系列算法)作为我国自主研发的密码算法标准,逐渐在各个领域中得到 ...
- maven maven-surefire-plugin的乱码问题
今天项目中出现奇怪问题,在eclipse中直接运行TestNG时,全部都OK,但是执行mvn test时却失败.观察其输出日志,发现有乱码,怀疑是乱码导致. 最终在官网发现蛛丝马迹. maven-su ...
- Qt/C++音视频开发69-保存监控pcm音频数据到mp4文件/监控录像/录像存储和回放/264/265/aac/pcm等
一.前言 用ffmpeg做音视频保存到mp4文件,都会遇到一个问题,尤其是在视频监控行业,就是监控摄像头设置的音频是PCM/G711A/G711U,解码后对应的格式是pcm_s16be/pcm_ala ...
- Qt开源作品41-网络调试助手增强版V2022
一.前言 做网络通信少不了网络收发数据,经常用到网络数据的调试相关工具,以便侦听数据用来判断数据是否正确,许久以前就发布过类似的工具,第一版大概在2013年,第二版大概在2017年,中间参考过不少的网 ...
- Qt开发经验小技巧156-160
Qt的UI界面在resize以后有个BUG,悬停样式没有取消掉,需要主动模拟鼠标动一下. void frmMain::on_btnMenu_Max_clicked() { ...... //最大化以后 ...