转载地址:

https://blog.csdn.net/tianyuan521521/article/details/46290525

前言

最近一直使用QGraphicsView框架在我的一个实际项目中,官方文档好多都没说清楚啊,有木有?!文档都翻光了,却还是有好多没明白。 
一个令我恼火的bug就是,明明log打出来的每个Item的坐标都是预期的,但为什么最后结果不对呢? 
我在视图中添加了一个直线项(QPoint(0,0),QPoint(100,100)); 
结果却是: 
 
有的同行看到可能会一下指出,我没有设置QGraphicsScene的SceneRect,所以所有的元素默认显示。 
是的,上面这个例子的确如此,但是即使我们设置了呢,结果却是这样: 
 
直线项确实不居中了,但是端点也没有在左上角啊!下面,我们就来深入结合例子弄清楚这一些问题。

解决之道

先上demo代码,很简单,

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QGraphicsView>
#include<QGraphicsScene>
#include<QDebug>
namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();void showView();//显示graphicsView的函数
private:QGraphicsScene *graphicsScene;//scene声明QGraphicsView *graphicsView;//view声明Ui::MainWindow *ui;
};#endif // MAINWINDOW_H
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);graphicsScene = new QGraphicsScene(this);graphicsView = new QGraphicsView(graphicsScene,this);QSize window =this->size();graphicsView->setFixedSize(this->width(),this->height());graphicsScene->addLine(0,0,100,100);}
void MainWindow::showView()
{graphicsView->show();
}MainWindow::~MainWindow()
{delete ui;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

main.cpp

#include "mainwindow.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);qDebug() <<"line location:"<<"\n";qDebug()<<"startPoint:" <<QPoint(0,0);qDebug()<<"endPoint:" <<QPoint(100,100);MainWindow w;w.show();w.showView();return a.exec();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

这份代码确实是QGraphicsScene和QGraphicsView的基本代码,并没有设置QGraphicsScene的sceneRect,所以结果也是大家可以预测的那样居中显示: 
 
但是!很多时候框架中自认为很令人方便的设计一点都不利于我们开发,我们开发人员习惯的坐标系统是左上角为(0,0)的坐标系统! 
于是,官方给出了解决方案:使用void setSceneRect(const QRectF & rect)控制sceneRect区域,这很人迷惑,就在我们这个例子中,我们想让scene左上角坐标是(0,0),是不是说只需要scene->setSceneRect(QRectF(0,0,W,H)就可以了呢?很遗憾的是,实验结果告诉我们不是: 
我们在上面的mainwindow.cpp里面设置scenRect为(0,0,150,150)试试看!:

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);graphicsScene = new QGraphicsScene(this);graphicsView = new QGraphicsView(graphicsScene,this);QSize window =this->size();graphicsView->setFixedSize(this->width(),this->height());graphicsScene->setSceneRect(0,0,150,150);graphicsScene->addLine(0,0,100,100);}
void MainWindow::showView()
{graphicsView->show();
}MainWindow::~MainWindow()
{delete ui;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

结果是: 
 
结果不是预期! 
其实,正确的解决方案是setSceneRect(0,0,W,H);而且需要

  • W>=static_cast< QWidget *>(graphicsScene->parent())->size().width()
  • H>=static_cast< QWidget *>(graphicsScene->parent())->size().height()

看再次修改后的代码:

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QWidget>
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);graphicsScene = new QGraphicsScene(this);graphicsView = new QGraphicsView(graphicsScene,this);QSize windowsize =this->size();graphicsView->setFixedSize(this->width(),this->height());graphicsScene->setSceneRect(0,0,static_cast<QWidget *>(graphicsScene->parent())->size().width(),static_cast<QWidget *>(graphicsScene->parent())->size().height());graphicsScene->addLine(0,0,100,100);}
void MainWindow::showView()
{graphicsView->show();
}MainWindow::~MainWindow()
{delete ui;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

运行结果:

 
下面有相应的工程下载: 
戳我下载

Qt工作笔记-QGraphicsView框架容易忽视的坐标问题-“画布”QgraphicsScene到底放在了哪儿?相关推荐

  1. Qt工作笔记-QGraphics框架场景中图元的移除与析构

    1.场景里面使用removeItem函数,这个函数官方给出如下解释 注意这个词remove只是移除,并不是delete掉,所以只是场景中(显示出来的图元)没有了,空间还是存在. 举个代码例子: voi ...

  2. Qt工作笔记-QGraphics框架中,给图像中的点连线【获取场景中的数据】【有坑】

    程序运行截图如下: 这里面有一个坑,就是获取场景中的元素并不是根据图像中,从左往右,从上往下这样的获取. 而是根据加入常见的先后,进行的, 如下图: Line是在Ellipse前加载的,所以是这样的结 ...

  3. Qt工作笔记-发送端发送Json格式的数据包,接收端解析数据包

    原理以及运行 原理是因为QJsonDocument提供了一个函数toJson 可以直接把Json数据转成QByteArray,这样就可以直接发送数据包,然后再按照常规方法解析即可,本源码中含解析内容, ...

  4. Qt工作笔记-QGraphics重设场景坐标【标签:Qt图形框架】

    Qt图形框架里面场景的坐标是以最中间为0,0点 作为新一辈的程序员,我是感觉到很新颖,但为了兼容其他的程序(图形要生成坐标,给其他程序读),要重设坐标点,把他搞为最左上为0,0点. 当没重设坐标点时, ...

  5. Qt工作笔记-视图(QGraphicsView)的放大和缩小(通过滚轮)

    程序运行截图如下: 关键的函数: 逻辑:通过滚轮事件,识别滚轮放大上移还是下移动,调用这个函数 源码如下: mygraphicsview.h #ifndef MYGRAPHICSVIEW_H #def ...

  6. Qt工作笔记-图形视图框架中的分组,以及添加平行拖动图元

    啥意思,感觉本人语文学得菜,不好描述. 直接看程序运行截图: 1.隐藏鼠标: 2.图元分组: 3.视图与场景坐标转换 程序源码如下: mygraphicsitem.h #ifndef MYGRAPHI ...

  7. Qt工作笔记-ListWidget拖动(拖拽)到QGraphicsScene【补坑】【Qt视图框架补坑】

    关于以前的这篇博文,进行补坑 https://blog.csdn.net/qq78442761/article/details/80957186 坑的位置在这,采用上面这篇博文的配法,无法得到图元在场 ...

  8. Qt工作笔记-列表的分页显示(Qt Widgets框架)

    目录 基本概念 演示及代码 打包下载 基本概念 关键是逻辑,因为数据都存储在数据结构中,如何把数据结构里面的东西显示到界面上,这才是分页的关键!估计稍微有代码量的程序员看到这就知道该怎么做了. 这里以 ...

  9. Qt工作笔记-QGraphicsScene练习【Qt图形框架练习】

    程序运行如下图所示: 程序结构如下: 代码如下: directitem.h #ifndef DIRECTITEM_H #define DIRECTITEM_H#include <QObject& ...

最新文章

  1. python代码优化_Python 代码优化技巧(一)
  2. Java IO - Reader
  3. 产品经理与项目经理的区别
  4. 阿里云峰会|数据库也能自动驾驶?DAS全天候给你保驾护航!
  5. 统计字符串中出现最多的单词和次多的单词
  6. tcp报文解析工具_15 张图,了解一下 TCP/IP 必知也必会的 10个要点
  7. 图像去雾之何凯明暗通道先验去雾算法原理及c++代码实现
  8. 高清图片免费下载网站
  9. 智慧路灯解决方案-最新全套文件
  10. matlab三次方程求根,如何用matlab求一元三次方程的最小正根?
  11. VS上位机开发——串口助手
  12. 抖音直播睡觉一晚赚7.6万,心态崩了
  13. 蜂鸣器干扰通讯_提高蜂鸣器响度和降低蜂鸣器及驱动电路干扰电源的电路的制作方法...
  14. 把妹需要勇敢,心有猛虎,细嗅蔷薇
  15. 李白 宣州谢朓楼饯别校书叔云
  16. 如何在网上回复负面评论
  17. 最新YGBOOK小说站源码/全自动采集+已修BUG
  18. gitlab代码查看行数
  19. tarjan BLO
  20. 浅析Go中三个点(...)用法

热门文章

  1. pl sql代码提示手动提示设置
  2. 这份数十万人浏览,作为企业风向标的BI报告,你一定要看看
  3. 传闻中“日进斗金”的程序员,你真的了解吗?看完还想当程序员?
  4. 我,35岁,程序员,华为工作10年,上个月公司说不再续约
  5. 从每年的编程语言排行来看,为什么C/C++能稳居前五?
  6. 经典面试题(3):关于this指向的常见面试题
  7. 第一节:什么是ES6?新手该如何理解
  8. java maven module_java – Maven JDK9模块:无法解析module-info
  9. 扫雷打开的初始区域递归_Python:游戏:写一个和 XP 上一模一样的“扫雷”!
  10. excel插入行 uipath_Uipath中excel的activities用法介绍