在graphicsview中显示tile map和其他一些对象的最佳方法是什么?

时间:2016-05-18 13:05:32

标签: qt tile qgraphicsview scene qgraphicsitem

最近我开始学习Qt,现在我正在研究GCS项目,它必须有一个带有一些平铺图像的地图,以及一些图形项目,如Plan,路径以及所有一些尺度。 所以我们有3种项目:

  1. 在背景中平铺地图,以便通过滚动来改变它。
  2. 在中间有一张飞机的图片,它按照gps的变化而移动。
  3. 关于这些物品的全部开关有3或4个仪表,如速度表,水平仪表和高度计仪表,在图形视图的某处必须是实心的,向下/向上或向右滚动时不会改变
  4. 问题是实现这个的最佳方法是什么? 这是我项目的第一眼:

    GCS

    在第一个看量表不是在地图上,但我想成为!我希望有更大的地图屏幕和仪表包括它!

    这是地图更新程序代码:

    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!";
               }
    
    
            }
        }
    

1 个答案:

答案 0 :(得分:1)

真的,你应该考虑使用QML。使用QML而不是QGraphicsView的优点是,与直接在C ++中工作相比,您可以更快地迭代。主要缺点是通常会增加内存使用量并与QWidgets不兼容。

因此,如果您需要独特的图形和非常少的“标准小部件”,那么您应首先使用QML,然后仅使用QGraphicsView,如果要求它。

特定于您的项目,Qt有一个可能有用的Map类型:https://doc.qt.io/qt-5/qml-qtlocation-map.html