当前位置: 首页 > news >正文

QT图形显示和处理5

有了之前的一些基础,现在开始讲图形项和场景。前面我花了整整两节来详细讲述了绘图的坐标系,大家一定要好好理解一下。

现在我们介绍场景和图元。我换一种讲解思路,讲完图元以后就开始直接讲场景坐标系统。

所谓图形项,比如你玩的坦克大战游戏,这个坦克可以随意运动,它整体就是一个图形项,它可以发出子弹,每个子弹也是图形项。我们可以定义一个图形项,然后把它放在场景里,并控制它的运动。

我们实现如下代码:(具体头文件大家包含一下就行了。)

        QGraphicsScene *scene;
	QGraphicsRectItem *item,*item2;
	QGraphicsView *view ,*view2;
	scene = new QGraphicsScene;
	item = new QGraphicsRectItem(0, 0, 100, 100);
	item2 = new QGraphicsRectItem(200, 100, 110, 100);
	scene->addItem(item);scene->addItem(item2);
	//第三个参数 const QTransform &deviceTransform
	//if (scene.itemAt(30, 30, QTransform()) == item)
		//DebugText::getDebugText()->addContents("right ! ");

	scene->setForegroundBrush(QColor(255,255,0,100));
	scene->setBackgroundBrush(QColor(255,0,0,120));

	view = new QGraphicsView(scene);
	view->setForegroundBrush(QColor(255, 255, 0, 100));
	view->setBackgroundBrush(QPixmap("./ShowDebug/background.png"));
	//view->resize(400, 300);
	view->show();
	view->setDragMode(QGraphicsView::RubberBandDrag);

	view2 = new QGraphicsView(scene);
	//view2->resize(400,300);
	view2->setDragMode(QGraphicsView::ScrollHandDrag);
	view2->show();

首先我们定义了一个场景,所谓场景,就是一片虚拟区域,这个区域是有坐标轴的,和之前的setWindow的坐标轴一样。然后你可以定义两个item,并通过addItem把它们放到场景中去。之后再通过:

	scene->setForegroundBrush(QColor(255,255,0,100));
	scene->setBackgroundBrush(QColor(255,0,0,120));

之后我们设置 QGraphicsView ,和之前的setViewport 相似,这里的view也代表了实际物理区域的坐标,最左上角是0,0.最右下角是(width(),height()),之后我们通过图片给view设置了背景。

view->setDragMode(QGraphicsView::RubberBandDrag);

这个函数是用来设置手型抓取移动屏幕的函数。以及后面有个类似的函数设置滚轮移动。

之间有两行函数:

if (scene.itemAt(30, 30, QTransform()) == item)
		DebugText::getDebugText()->addContents("right ! ");

这个是用来查看在场景中30,30的图形项是不是我们之前定义的item,如果是就调试框显示一个right。

注意view2因为绑定的是scene,它的场景就全都是由scene构成的,而不像view对象一样里面有图片背景。

显示如下:

放大以后显示如下:

注意到这个view是由多个图片拼接形成的,现在的情况是因为我们没有设置view和scene的对应关系,所以QT自动把图形项显示在中心区域,而不是把scene的坐标原点定义在最中心(虽然图形项显示的不清楚,仔细看还是能看出来这两个正方形的)。左上的图形项的左上角对应场景区域的(0,0)点,也就是坐标原点,而再往左,场景区域的值就变为负值了。

我们下次就把scene和view定义在一起,这样就能让scene的坐标和view的坐标相等了。

相关文章:

  • QT图形显示和处理6
  • QT图形显示和处理7
  • QT图形显示和处理8
  • QT传输函数控件设计1 引子
  • QT传输函数控件设计2 体渲染和VTK
  • QT传输函数控件设计3 QVTKWidget和QT图形界面的融合
  • QT传输函数控件设计4 接着进行融合
  • QT传输函数控件设计5 显示体渲染效果
  • QT传输函数控件设计6 设计Dock窗体结构
  • QT传输函数控件设计7 边界和布局规划
  • QT传输函数控件设计8 设计小圆点
  • QT传输函数控件设计9 初步设计视口类
  • QT传输函数控件设计10 包含小圆点的图形项
  • QT传输函数控件设计11 包含小圆点的图形项2
  • QT传输函数控件设计12 自定义信号和槽
  • co.js - 让异步代码同步化
  • Flannel解读
  • JavaScript实现分页效果
  • Java教程_软件开发基础
  • node 版本过低
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 动态魔术使用DBMS_SQL
  • 老板让我十分钟上手nx-admin
  • 爬虫模拟登陆 SegmentFault
  • 算法-插入排序
  • 移动端唤起键盘时取消position:fixed定位
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • #大学#套接字
  • #微信小程序:微信小程序常见的配置传值
  • (06)金属布线——为半导体注入生命的连接
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (转载)深入super,看Python如何解决钻石继承难题
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • /proc/vmstat 详解
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @Repository 注解
  • [1] 平面(Plane)图形的生成算法
  • [BZOJ] 2006: [NOI2010]超级钢琴
  • [C++]C++入门--引用
  • [C++数据结构](22)哈希表与unordered_set,unordered_map实现
  • [docker] Docker容器服务更新与发现之consul
  • [E单调栈] lc2487. 从链表中移除节点(单调栈+递归+反转链表+多思路)
  • [ffmpeg] x264 配置参数解析
  • [GXYCTF2019]BabySQli1
  • [HNOI2018]排列
  • [LeetCode]—Simplify Path 简化路径表达式
  • [Linux]使用CentOS镜像与rpm来安装虚拟机软件