【问题标题】:what is the best way to show tile map and some other object in graphicsview?在图形视图中显示平铺地图和其他对象的最佳方式是什么?
【发布时间】:2016-09-14 23:51:10
【问题描述】:

最近我开始学习 Qt,现在我正在从事 GCS 项目,它必须有一个带有一些平铺图像的地图和一些图形项目,如计划、路径以及所有一些仪表。 所以我们有 3 种物品:

  1. 背景中的平铺地图可以通过滚动进行更改。
  2. 中间有一张飞机的图片,它随着gps的变化而移动。
  3. 在所有这些项目上,有 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!";
           }


        }
    }

【问题讨论】:

    标签: qt tile qgraphicsview scene qgraphicsitem


    【解决方案1】:

    确实,您应该考虑使用 QML。使用 QML 而不是 QGraphicsView 的优点是您可以比直接使用 C++ 更快地进行迭代。主要缺点通常是内存使用量增加以及与 QWidgets 不兼容。

    因此,如果您需要独特的图形和非常少的“标准小部件”东西,则应先使用 QML,然后仅在需要时才使用 QGraphicsView。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-11
      • 2011-05-20
      相关资源
      最近更新 更多