4

recently i start to learn Qt and now i'm working on GCS project that it must have a map with some tiled imges and and some graphics item like Plan,the path and also on over off all some gauge. so we have 3 kind of item:

  1. Tiled map in the background so that its change by scrolling .
  2. in the middle there is a picture of airplane that move by gps changes and also its way .
  3. on the all on off these items there 3 or 4 gauge like speed meter, horizontal gauge and altimeter gauge there are must be solid in somewhere of graphicsview and not change when scrolling down/up or left right

The question is what is the best way to implement this ? here is first look of my project:

GCS

in first look gauge are not over map but i want to be ! i want to have bigger map screen with gauges include it !

And here is map updater code :

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


        }
    }
M410
  • 301
  • 3
  • 15

1 Answers1

1

Really, you should consider using QML. The advantage of using QML instead of QGraphicsView is you can iterate a lot faster than if you were working directly in C++. The primary downside is generally increased memory usage and incompatibility with QWidgets.

So if you need unique graphics, and very little "standard widget" stuff, you should use QML first and then QGraphicsView ONLY IF requirements dictate it.

Specific to your project though, Qt has a Map type which could be useful: https://doc.qt.io/qt-5/qml-qtlocation-map.html

Sohail
  • 3,020
  • 1
  • 25
  • 23