2011-07-06 87 views
0

我有兩個類:第一個生成位置數據(經度和緯度),我如何在第二類訪問這些數據(變量緯度和變形)? 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); 
} 

例如,我想看看在第二類緯度,按下按鈕。將來我會通過信號/插槽每次生成標籤文本來完成此位置更新。但現在我會變瘋狂的號碼。 請幫助我

回答

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

您創建的MainWindow一個新的實例,並直接訪問它的latitude成員。但它初始化了嗎?我看到在MainWindow中寫入此成員的唯一地方是positionUpdated。您確定在訪問mw->latitude之前調用此方法嗎?您可以使用另一個qDebugpositionUpdated打印輸出或使用調試器輕鬆驗證。


要評論一般的代碼風格 - 直接訪問其他類的成員是不好的做法。其中一個問題(正如您剛剛遇到的!)採用這種方法是類無法真正控制其成員的有效性。即使是最基本的解決方案 - 使用訪問方法而不是原始成員訪問可能會爲您在這裏創造奇蹟,因爲訪問方法可能會檢查值是否已計算(或者甚至是懶洋洋地計算)。

+0

如果我在positionupdated中創建qdebug,我可以看到正常的位置。你能解釋一下你說的更多細節嗎?或者可能在我的例子? – user707895

相關問題