Qt 在graphicsview中显示平铺贴图和其他对象的最佳方式是什么?
最近我开始学习Qt,现在我正在从事GCS项目,它必须有一张地图,上面有一些平铺的图像和一些图形项目,比如平面图、路径图和一些仪表。 我们有3种产品:Qt 在graphicsview中显示平铺贴图和其他对象的最佳方式是什么?,qt,tile,qgraphicsview,scene,qgraphicsitem,Qt,Tile,Qgraphicsview,Scene,Qgraphicsitem,最近我开始学习Qt,现在我正在从事GCS项目,它必须有一张地图,上面有一些平铺的图像和一些图形项目,比如平面图、路径图和一些仪表。 我们有3种产品: 在背景中平铺贴图,使其通过滚动进行更改 在中间有一张通过gps移动的飞机的图片,它改变了方向 在所有开关上,这些项目有3或4个仪表,如速度表、水平仪表和高度表,在图形视图的某个位置必须是实心的,并且在向下/向上或向左/向右滚动时不会改变 问题是什么是实现这一点的最佳方式? 以下是我的项目的第一眼: 第一眼看,仪表不在地图上,但我想是!我想有更大的
void mainMap::update()
{
m_scene->clear();
QString TilePathTemp;
QImage *imageTemp = new QImage();
int X_Start=visibleRect().topLeft().x()/256;
int X_Num=qCeil((float)visibleRect().bottomRight().x()/256.0f-(float)visibleRect().topLeft().x()/256.0f);
int Y_Start=visibleRect().topLeft().y()/256;
int Y_Num=qCeil((float)visibleRect().bottomRight().y()/256.0f-(float)visibleRect().topLeft().y()/256.0f);
LastCenterPoint->setX(visibleRect().center().x());
LastCenterPoint->setY(visibleRect().center().y());
X_Start=(X_Start-X_MAP_MARGIN)>0?(X_Start-X_MAP_MARGIN):0;
Y_Start=(Y_Start-Y_MAP_MARGIN)>0?(Y_Start-Y_MAP_MARGIN):0;
X_Num+=X_MAP_MARGIN;
Y_Num+=Y_MAP_MARGIN;
qDebug()<<"XS:"<<X_Start<<" Num:"<<X_Num;
qDebug()<<"YS:"<<Y_Start<<" Num:"<<Y_Num;
for(int x=X_Start;x<=X_Start+X_Num;x++){
for(int y=Y_Start;y<=Y_Start+Y_Num;y++){
if(Setting->value("MapType",gis::Hybrid).toInt()==gis::Hybrid) TilePathTemp=Setting->value("MapPath","/Users/M410/Documents/Map").toString()+"/Hybrid/gh_"+QString::number(x)+"_"+QString::number(y)+"_"+QString::number(ZoomLevel)+".jpeg" ;
else if(Setting->value("MapType",gis::Sattelite).toInt()==gis::Sattelite) TilePathTemp=Setting->value("MapPath","/Users/M410/Documents/Map").toString()+"/Sattelite/gs_"+QString::number(x)+"_"+QString::number(y)+"_"+QString::number(ZoomLevel)+".jpeg" ;
else if(Setting->value("MapType",gis::Street).toInt()==gis::Street) TilePathTemp=Setting->value("MapPath","/Users/M410/Documents/Map").toString()+"/Street/gm_"+QString::number(x)+"_"+QString::number(y)+"_"+QString::number(ZoomLevel)+".jpeg" ;
QFileInfo check_file(TilePathTemp);
// check if file exists and if yes: Is it really a file and no directory?
if (check_file.exists() && check_file.isFile()) {
// qDebug()<<"Exist!";
imageTemp->load(TilePathTemp);
QPixmap srcImage = QPixmap::fromImage(*imageTemp);
//QPixmap srcImage("qrc:/Map/File1.jpeg");
QGraphicsPixmapItem* item = new QGraphicsPixmapItem(srcImage);
item->setPos(QPointF(x*256, y*256));
m_scene->addItem(item);
// centerOn( width() / 2.0f , height() / 2.0f );
} else {
qDebug()<<"NOT Exist!";
}
}
}
void mainMap::update()
{
m_场景->清除();
QString tilepathttemp;
QImage*imageTemp=新的QImage();
int X_Start=visibleRect().topLeft().X()/256;
int X_Num=qCeil((float)visibleRect().bottomRight().X()/256.0f-(float)visibleRect().topLeft().X()/256.0f);
int Y_Start=visibleRect().topLeft().Y()/256;
int Y_Num=qCeil((float)visibleRect().bottomRight().Y()/256.0f-(float)visibleRect().topLeft().Y()/256.0f);
LastCenterPoint->setX(visibleRect().center().x());
LastCenterPoint->setY(visibleRect().center().y());
X_Start=(X_Start-X_MAP_MARGIN)>0?(X_Start-X_MAP_MARGIN):0;
Y_Start=(Y_Start-Y_MAP_MARGIN)>0?(Y_Start-Y_MAP_MARGIN):0;
X_Num+=X_映射_边距;
Y_Num+=Y_映射_边距;
实际上,你应该考虑使用QML。使用QML代替QGoCICsVIEW的优点是,如果你直接在C++中工作,你可以迭代得更快。主要缺点是内存使用量增加,与QWIDGET不兼容。
所以,如果您需要独特的图形,以及很少的“标准小部件”内容,您应该首先使用QML,然后使用QGraphicsView,只有在需求要求时才使用
但是,对于您的项目,Qt有一种可能很有用的映射类型: