2011-07-06 55 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

相关问题