2011-07-06 27 views
0

私は2つのクラスを持っています:最初に位置データ(緯度と経度)を生成し、2番目のクラスでこのデータ(緯度と経度変数)にどのようにアクセスできますか?私が得る第二のクラスでクレイジー数をbecouse(ここでQTモビリティで別のクラスの変数にアクセスする方法は?

は、ヘッダとクラスは次のとおりです。 最初のヘッダー:

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QGeoPositionInfoSource> 
#include <QGeoPositionInfo> 
#include <QtCore/QPointer> 
#include <QGeoSatelliteInfo> 
#include <QGeoSatelliteInfoSource> 
#include "gpsform.h" 
QTM_USE_NAMESPACE 

namespace Ui { 
    class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
    double latitude; 
    double longitude; 
    double altitude; 
    double speed; 

public slots: 
    void positionUpdated(QGeoPositionInfo geoPositionInfo); 

private: 
    Ui::MainWindow *ui;  
    QPointer<QGeoPositionInfoSource> locationDataSource; 

private slots: 
    void on_pushButton_2_clicked(); 
    void on_pushButton_4_clicked(); 
    void startGPS(); 
    void on_pushButton_clicked(); 

signals: 
    void updated(); 
}; 

#endif // MAINWINDOW_H 

ファーストクラス

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include "quitdiallog.h" 
#include <QGeoCoordinate> 
#include <QDebug> 
#include <QtGui/QMessageBox> 
#include <QList> 
#include "gpsform.h" 
MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    setWindowTitle("Мой кОмпаС"); 
    ui->setupUi(this); 
    startGPS(); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 
void MainWindow::startGPS() 
{ 
    // Obtain the location data source if it is not obtained already 
    if (!locationDataSource) 
    { 
     locationDataSource = 
       QGeoPositionInfoSource::createDefaultSource(this); 
     if (locationDataSource) 
     { 
      // Whenever the location data source signals that the current 
      // position is updated, the positionUpdated function is called. 
      QObject::connect(locationDataSource, 
          SIGNAL(positionUpdated(QGeoPositionInfo)), 
          this, 
          SLOT(positionUpdated(QGeoPositionInfo))); 
      // Start listening for position updates 
        locationDataSource->setUpdateInterval(100); 
        locationDataSource->setPreferredPositioningMethods(QGeoPositionInfoSource::SatellitePositioningMethods); 
      locationDataSource->startUpdates(); 
     } else { 
      // Not able to obtain the location data source 
      // TODO: Error handling 
     } 
    } else { 
     // Start listening for position updates 
     locationDataSource->setUpdateInterval(5000); 
     locationDataSource->startUpdates(); 
    } 
} 

void MainWindow::positionUpdated(QGeoPositionInfo geoPositionInfo) 
{ 
    //gpsform *gpf=new gpsform; 
    if (geoPositionInfo.isValid()) 
    { 
     //locationDataSource->stopUpdates(); 
     QGeoCoordinate geoCoordinate = geoPositionInfo.coordinate(); 
     latitude = geoCoordinate.latitude(); 
     longitude = geoCoordinate.longitude(); 
     altitude=geoCoordinate.altitude(); 
    ui->label->setNum(latitude); 
    ui->label_2->setNum(longitude); 
    /*if(QGeoPositionInfo::GroundSpeed) 
    { 
     speed=QGeoPositionInfo::GroundSpeed; 
    ui->label_4->setNum(speed); 
    }*/ 
    emit updated(); 
    //gpf->latitude=this->latitude; 
    //gpsform *gpf=new gpsform; 
    //gpf->show(); 
    //gpf->latitude=latitude; 
    } 
} 



void MainWindow::on_pushButton_clicked() 
{  
    /*ui->label_3->setNum(latitude); 
    qDebug()<<latitude<<" "<<longitude<<" "<<altitude;*/ 
    gpsform *gps=new gpsform; 
    this->hide(); 
    gps->show(); 

} 

void MainWindow::on_pushButton_4_clicked() 
{ 
    QuitDiallog *qi=new QuitDiallog; 
    this->hide(); 
    qi->show(); 
} 

void MainWindow::on_pushButton_2_clicked() 
{ 
    ui->label_3->setNum(latitude); 
} 

二ヘッダ

#ifndef GPSFORM_H 
#define GPSFORM_H 

#include <QWidget> 
#include "mainwindow.h" 
QTM_USE_NAMESPACE 
namespace Ui { 
    class gpsform; 
} 

class gpsform : public QWidget 
{ 
    Q_OBJECT 

public: 
    explicit gpsform(QWidget *parent = 0); 
    ~gpsform(); 
    double latitude; 

private: 
    Ui::gpsform *ui;  

private slots:  
    void on_pushButton_clicked(); 
    void updatedata(); 
}; 

#endif // GPSFORM_H 

番目のクラス:たとえば

#include "gpsform.h" 
#include "ui_gpsform.h" 
#include "mainwindow.h" 
#include <QTimer> 
#include <QDebug> 

gpsform::gpsform(QWidget *parent) : 
    QWidget(parent), 
    ui(new Ui::gpsform) 
{ 
    ui->setupUi(this); 
    /*ui->label->setNum(mw->latitude);*/ 
    /* QTimer * timer = new QTimer(this); 
    connect(timer,SIGNAL(timeout()),this,SLOT(update())); 
    timer->start(50);*/ 
    /* MainWindow *mw = new MainWindow; 
    QObject::connect(mw,SIGNAL(updated()),this,SLOT(updatedata()));*/ 
} 

gpsform::~gpsform() 
{ 
    delete ui; 
} 

void gpsform::updatedata() 
{ 
    /* MainWindow *mw = new MainWindow; 
    this->latitude=mw->latitude; 
    ui->label->setNum(mw->latitude);*/ 
} 

void gpsform::on_pushButton_clicked() 
{ 
     MainWindow *mw = new MainWindow; 
     //latitude=mw->latitude; 
     qDebug()<<mw->latitude; 
     ui->label->setNum(latitude); 
} 

私はボタンを押すことにより、第二のクラスで緯度を見てみたいです。将来は、毎回ラベルテキストを生成するためにSignal/slotでこれを行い、位置が更新されます。しかし今、私は狂気の数を取得します。

答えて

0
MainWindow *mw = new MainWindow; 
    //latitude=mw->latitude; 
    qDebug()<<mw->latitude; 

あなたはMainWindowの新しいインスタンスを作成し、直接そのlatitudeメンバーにアクセスする私を助けてください。しかしそれは初期化されましたか?私はMainWindowにこのメンバーに書いている唯一の場所がpositionUpdatedだと思っています。あなたはmw->latitudeにアクセスする前にこのメソッドが呼び出されたのでしょうか? qDebugの出力をpositionUpdatedから、またはデバッガを使って簡単に確認できます。


一般的にコードスタイルにコメントするには - それは、直接このような他のクラスのメンバーにアクセスすることをお勧めではありません。このアプローチの問題の1つ(あなたが今直面したように!)は、クラスにメンバーの有効性を実際に制御する方法がないということです。アクセサーメソッドは、値が計算されているかどうかをチェックすることができます(または遅延計算も)可能性があるため、基本メンバーのアクセスではなくアクセサーメソッドを使用するという最も基本的なソリューションでも、ここで不思議に思うかもしれません。

+0

qdbugをpositionupdatedに作成すると、通常の位置がわかります。あなたはもっと詳しく話してくれますか?または私の例で多分? – user707895

関連する問題