2016-05-18 2 views
4

récemment je commence à apprendre Qt et maintenant je travaille sur le projet GCS qu'il doit avoir une carte avec quelques imges en mosaïque et et certains éléments graphiques comme Plan, le chemin et aussi sur toute la jauge. donc nous avons 3 type d'article:quelle est la meilleure façon d'afficher la carte de tuile et un autre objet dans graphicsview?

  1. Carte en mosaïque en arrière-plan de sorte que son changement par défilement. Au milieu, il y a une image de l'avion qui se déplace par changements de gps et aussi son chemin.
  2. le tout sur de ces articles là 3 ou 4 de calibre comme compteur de vitesse, jauge horizontale et jauge altimètre il y a doit être solide dans un endroit de graphicsview et ne change pas lors du défilement vers le bas/vers le haut ou gauche à droite

La question est quelle est la meilleure façon de mettre en œuvre cela? ici est le premier aspect de mon projet:

GCS

dans la première jauge de regard ne sont pas sur la carte, mais je veux être! Je veux avoir un plus grand écran de carte avec des jauges l'inclure!

Et voici la carte Code Updater:

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


     } 
    } 

Répondre

1

Vraiment, vous devriez envisager d'utiliser QML. L'avantage d'utiliser QML au lieu de QGraphicsView est que vous pouvez parcourir beaucoup plus rapidement que si vous travailliez directement en C++. Le principal inconvénient est généralement l'augmentation de l'utilisation de la mémoire et l'incompatibilité avec QWidgets. Donc, si vous avez besoin de graphiques uniques, et très peu de choses "widget standard", vous devez utiliser QML d'abord, puis QGraphicsView UNIQUEMENT SI les exigences le dictent.

Spécifique à votre projet cependant, Qt a un type de carte qui pourrait être utile: https://doc.qt.io/qt-5/qml-qtlocation-map.html