QGraphicsView QGraphics 窗口自适应 您所在的位置:网站首页 cad图形失真显示调整图形大小 QGraphicsView QGraphics 窗口自适应

QGraphicsView QGraphics 窗口自适应

2023-07-25 21:20| 来源: 网络整理| 查看: 265

QGraphicsView 窗口自适应Items

文章目录 前言一、原理介绍二、初始准备工作代码实现 三、关键实现自定义QGraphicsView窗口自适应 总结

前言

在这里插入图片描述 绘制或导入的QGraphicsItem可能会很大或很小,我们想要根据现实窗口的大小自适应显示item,基于个人对QGraphics Scene、Graphics Item、Graphics View关系1的理解,发现一种方法使用可以解决需求。

一、原理介绍

在这里插入图片描述

如图所示情况下Item大于view显示的范围,那么我们需要按照一定比例缩放view来保证item完整显示,所用函数为:

m_view->fitInView(rectItem, Qt::KeepAspectRatio);

缩放模式选择配置参数说明如下所示(来自Qt Assistant)

在这里插入图片描述

但是直接按照items的外轮廓适应窗口会得到如下结果:

在这里插入图片描述

只适应了横向或纵向中的一个,如何让横向纵向同时适应呢?

在这里插入图片描述

使红色虚线框的横纵比和蓝色边框的横纵比相同,对红色边框宽或高适当放大,并依旧保持Item在中心位置再调用fitInview即可整体适应。

二、初始准备工作

新开一个QWidget,新建QGraphicsScene并添加QGraphicsView到QWidget,绘制一个特定形状的QGraphicsItem添加到QGraphicsScene中。

代码实现

新建窗口:

/**************************************************************** Doc : main.cpp Author : BingLee Date : 2020-9-25 Info : QGraphicsView auto fit. https://blog.csdn.net/Bing_Lee (C)All rights reserved. ******************************************************************/ #include "mainwindow.h" #include int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); w.resize(300, 300); return a.exec(); }

创建scene,view和item:

#include "mainwindow.h" #include "mygraphicview.h" #include #include #include #include #include #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { m_vBoxLayout = new QVBoxLayout(); m_centralWidget = new QWidget(this); setCentralWidget(m_centralWidget); m_centralWidget->setLayout(m_vBoxLayout); DrawDemo(); this->setWindowTitle("Demo1"); } void MainWindow::DrawDemo() { QGraphicsScene *scene = new QGraphicsScene(); // 定义一个场景,设置背景色为白色 scene->setBackgroundBrush(Qt::white); QPen pen; // 定义一个画笔,设置画笔颜色和宽度 pen.setColor(QColor(0, 160, 230)); pen.setWidth(10); QGraphicsPolygonItem *polygonItem = new QGraphicsPolygonItem(); // 定义一个多边形图元 QPolygonF polygon; polygon QRectF rectItem = scene()->itemsBoundingRect(); QRectF rectView = m_view->rect(); qreal ratioView = rectView.height() / rectView.width(); qreal ratioItem = rectItem.height() / rectItem.width(); if (ratioView > ratioItem) { rectItem.moveTop(rectItem.width()*ratioView - rectItem.height()); rectItem.setHeight(rectItem.width()*ratioView); rectItem.setWidth(rectItem.width() * 1.2); rectItem.setHeight(rectItem.height() * 1.2); } else { rectItem.moveLeft(rectItem.height()/ratioView - rectItem.width()); rectItem.setWidth(rectItem.height()/ratioView); rectItem.setWidth(rectItem.width() * 1.2); rectItem.setHeight(rectItem.height() * 1.2); } m_view->fitInView(rectItem, Qt::KeepAspectRatio); }

在这里插入图片描述

总结

以上就是今天要讲的内容,本文简单介绍了QGraphcisView自适应窗口大小的实现. 如果本文帮助到你了的话请帮忙点赞、评论、关注三连哦~

源代码下载链接:QGraphicsViewAutofit.zip

QGraphics Scene、Graphics Item、Graphics View关系及一个实例 ↩︎



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有