QTGraphicsViewFramework学习

本文介绍Qt Graphics View框架的基本概念与架构,通过一个海战模拟的例子演示如何使用自定义的图形项(QGraphicsItem)实现动态更新的场景。文章详细展示了如何创建和管理图形对象,以及如何利用定时器事件更新这些对象的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、简介

Graphics View是一个基于item的M-V架构的框架,“Qt Graphics View 提供了用于管理和交互大量定制的 2D 图形对象的平面以及可视化显示对象的视图 widget,并支持缩放和旋转功能。Graphics View 使用 BSP(二进制空间划分)树形可非常快速地找到对象,因此即使是包含百万个对象的大型场景,也能实时图形化显示。”M-V架构的意思是, Graphics View提供一个model和一个view。所谓model就是我们添加的种种对象,所谓view就是我们观察这些对象的视口。同一个model可以由很多view从不同的角度进行观察。
Graphics View提供了一个QGraphicsScene作为场景,即是我们添加图形的空间,相当于整个世界;一个QGraphicsView作为视口,也就是我们观察的窗口,相当于照相机的取景框,这个取景框可以覆盖整个场景,也可以是场景的一部分;一些QGraphicsItem作为图形元件,以便scene添加,Qt内置了很多图形,比如line、polygon等,都是继承自QGraphicsItem。
2、例子学习
#ifndef _GRAPHICSVIEW_FRAMEWORK_H_
#define _GRAPHICSVIEW_FRAMEWORK_H_
#pragma once

/**QGraphicsItem*/
class MyItem:public QGraphicsItem
{
friend class MyView;
public:
	MyItem();
	QRectF boundingRect() const;
	void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget /* = 0 */);

protected:
	void contextMenuEvent(QGraphicsSceneContextMenuEvent *event);
protected:
	qreal course;
	qreal speed;
	short type;
	short attribute;
	QColor color;

};

class MyView:public QGraphicsView
{
	Q_OBJECT
public:
	MyView(QGraphicsScene* scene,QWidget* parent=0);
	QAction* actionStrike;
public slots:
	void timerEvent(QTimerEvent *);
};

class GraphicsViewFramework
{
public:
	static void SimulatedWar();
};
#endif//_GRAPHICSVIEW_FRAMEWORK_H_

#include "stdafx.h"
#include <cmath>
#include "GraphicsViewFramework.h"

MyItem::MyItem():speed(qrand()%10+1),type(qrand()%3),attribute(qrand()%3),course(qrand()%360)
{
	switch(attribute)
	{
	case 0:
		color.setRgb(255,0,0);
		break;
	case 1:
		color.setRgb(0,255,0);
		break;
	default:
		color.setRgb(0,0,255);
		break;
	}
}

QRectF MyItem::boundingRect() const
{
	qreal adjust = 0.5;
	return QRectF(-20-adjust,-22-adjust,40+adjust,83+adjust);
}

void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget )
{
	QPen pen(color);
	pen.setWidth(2);
	painter->setPen(pen);
	switch(type)
	{
	case 0:
		painter->drawEllipse(-15,-15,30,30);
		break;
	case 1:
		painter->drawArc(-15,-15,30,30,180*16,180*16);
		break;
	default:
		painter->drawLine(-15,0,0,-15);
		painter->drawLine(0,-15,15,0);
		break;
	}
	painter->drawLine(0,0,int(speed*5*cos(course)),int(speed*5*sin(course)));
}

void MyItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
{
	QMenu menu;
	menu.setWindowOpacity(0.8);
	QAction* removeAction = menu.addAction(QObject::tr("武器发射"));
	QAction* markAction = menu.addAction(QObject::tr("电子干扰"));
	QAction* selectedAction = menu.exec(event->screenPos());

}

MyView::MyView(QGraphicsScene* scene,QWidget* parent):QGraphicsView(scene,parent)
{
	startTimer(1000);
	actionStrike = new QAction(QObject::tr("发射武器"),this);
}

void MyView::timerEvent(QTimerEvent * event)
{
	QList<QGraphicsItem*> itemlist = items();
	QGraphicsItem* item;
	foreach(item,itemlist)
	{
		MyItem* target = (MyItem*)item;
		target->setPos(target->mapToParent(target->speed*cos(target->course),target->speed*sin(target->course)));
	}
}

void GraphicsViewFramework::SimulatedWar()
{
	qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
	QGraphicsScene scene;
	scene.setSceneRect(-400,-300,800,600);
	scene.setItemIndexMethod(QGraphicsScene::NoIndex);

	for (int i = 0; i < 200; i++)
	{
		MyItem* target = new MyItem();
		target->setPos(qrand()%800-400,qrand()%600-300);
		target->setVisible(true);
		scene.addItem(target);
	}

	MyView view(&scene);
	view.setRenderHint(QPainter::Antialiasing);
	view.setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
	view.setBackgroundBrush(QColor(0,0,0));
	view.setCacheMode(QGraphicsView::CacheBackground);
	view.setDragMode(QGraphicsView::ScrollHandDrag);
	view.setWindowTitle(QObject::tr("海战模拟"));
	view.resize(800,600);
	view.show();
}
3、效果图



内容概要:本文介绍了基于PSASP的九节点电力系统暂态稳定分析的研究,主要探讨了九节点电力系统在遭受大扰动(如三相短路接地故障)时的暂态稳定性。作者利用PSASP软件建立系统模型,通过潮流计算获取初始运行状态,再模拟不同故障情况下系统的响应,重点分析了故障后发电机功角变化、母线电压波动及故障切除时间对系统稳定性的影响。研究表明,当故障切除时间小于0.315秒时,系统能够保持稳定;反之,则会失稳。为了便于理解和复现,文中还提供了使用Python和Pandapower库模拟九节点系统暂态稳定性的代码,包括创建系统模型、潮流计算、暂态稳定仿真、结果可视化及临界切除时间的确定。 适合人群:从事电力系统分析、控制与优化的研究人员和技术人员,尤其是对电力系统暂态稳定分析感兴趣的读者。 使用场景及目标:①理解九节点电力系统在不同故障条件下的暂态行为;②掌握如何使用PSASP和Pandapower等工具进行电力系统建模和仿真;③学习如何通过调整故障切除时间来确保电力系统的稳定性。 其他说明:本文不仅提供了理论分析,还给出了详细的代码示例,使读者能够在实践中加深对电力系统暂态稳定性的理解。此外,通过比较不同故障切除时间下的系统响应,读者可以更好地掌握如何评估和提高电力系统的安全性与可靠性。
内容概要:本文详细介绍了数据清洗的概念、目标、基本流程及其在不同领域的运用。数据清洗旨在提高数据质量,通过识别和修正错误数据、去除无关或重复的数据来确保数据的准确性。文中还具体讲解了ETL(Extract, Transform, Load)过程及其常用工具如Kettle、Hawk和PowerCenter的功能与使用方法。对于Kettle,文章深入描述了其安装配置、各种输入输出控件的操作、以及多种转换和流程控制组件的应用场景。 适合人群:从事数据管理、数据分析、数据挖掘等相关工作的技术人员,尤其是那些希望深入了解数据清洗技术和ETL工具使用的人士。 使用场景及目标:①帮助用户掌握数据清洗的基本理论和技术手段;②指导用户在实际工作中运用ETL工具进行数据抽取、转换和加载操作;③使用户能够熟练使用Kettle等工具完成复杂的数据处理任务,如数据导入导出、清洗规则定义、异常值处理、数据拼接、字段转换等。 其他说明:本文不仅提供了数据清洗的基础知识,还结合实际案例详细介绍了Kettle工具的具体操作步骤,包括但不限于CSV、Excel、文本文件、JSON、XML等格式的数据处理方式,以及如何利用各种控件实现数据的清洗、转换和加载。此外,还涉及了一些高级功能如分组统计、条件判断、空值处理等,有助于读者全面理解和掌握数据清洗的全流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值