как получить доступ к переменной из одного класса в другом в мобильности 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
#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
#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);
}
clicked() { QuitDiallog *qi=new QuitDiallog; this->hide(); qi->show(); } void MainWindow::on_pushButton_2_clicked() { ui->label_3->setNum(latitude); }
clicked(); void on_pushButton
#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);
}
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
#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);
}
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);
}

Например, я хочу увидеть широту во втором классе, нажав кнопку. В будущем я буду делать это по сигналу/слоту, чтобы генерировать текст метки каждый раз, когда позиция обновляется. Но сейчас я наберу сумасшедший номер. Помогите мне, пожалуйста


person user707895    schedule 06.07.2011    source источник


Ответы (1)


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

Вы создаете новый экземпляр MainWindow и напрямую получаете доступ к его члену latitude. Но был ли он инициализирован? Я вижу, что единственное место для записи этого члена в MainWindow — это positionUpdated. Вы уверены, что этот метод вызывается до того, как вы получите доступ к mw->latitude? Вы можете легко убедиться в этом с помощью другой qDebug распечатки из positionUpdated или с помощью отладчика.


Чтобы прокомментировать стиль кода в целом - не рекомендуется напрямую обращаться к членам других классов, подобных этому. Одна из проблем (с которой вы только что столкнулись!) при таком подходе заключается в том, что у класса нет возможности фактически контролировать действительность своего члена. Даже самое простое решение — наличие метода доступа вместо необработанного доступа к членам может сотворить здесь чудеса, потому что метод доступа потенциально может проверить, было ли вычислено значение (или даже вычислить его лениво).

person Eli Bendersky    schedule 07.07.2011
comment
если я создаю qdebug в positionupdated, я вижу нормальные позиции. Можете ли вы объяснить мне, что вы говорите более подробно? или может на моем примере??? - person user707895; 07.07.2011