2013-06-20 3 views
0

Я хочу преобразовать QString из другого класса toInt, но он не работает, потому что результат равен 0, а он должен быть 5, а остальная часть кода работает , Поскольку я новичок в C/Qt и считаю классы немного запутанными, я думаю, что сделал что-то не так с моими классами.QString :: toInt() не работает при преобразовании QString из другого класса

widget.cpp

#include "widget.h" 
#include "ui_widget.h" 

Widget::Widget(QWidget *parent) : 
    QWidget(parent), 
    ui(new Ui::Widget) 
{ 
    ui->setupUi(this); 
} 

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

void Widget::on_pushButton_clicked() 
{ 
    MyClass tmp; 
    int myNumber = tmp.m_replyStr.toInt(); 
    ui->lcdNumber->display(myNumber); 
} 

MyClass::MyClass() 
{ 
    m_manager = new QNetworkAccessManager(this); 

    connect(m_manager, SIGNAL(finished(QNetworkReply*)), 
      this, SLOT(replyFinished(QNetworkReply*))); 
} 

void MyClass::fetch() 
{ 
    m_manager->get(QNetworkRequest(QUrl("http://example.tld/test.html"))); // html contains only the number 5 
} 

void MyClass::replyFinished(QNetworkReply* pReply) 
{ 
    QByteArray data=pReply->readAll(); 
    QString str(data); 
    m_replyStr = str; 
} 

widget.h

#ifndef WIDGET_H 
#define WIDGET_H 

#include <QWidget> 
#include <QObject> 
#include <QNetworkAccessManager> 
#include <QUrl> 
#include <QNetworkRequest> 
#include <QNetworkReply> 

namespace Ui { 
    class Widget; 
} 

class Widget : public QWidget 
{ 
    Q_OBJECT 

public: 
    explicit Widget(QWidget *parent = 0); 
    ~Widget(); 

private slots: 
    void on_pushButton_clicked(); 

private: 
    Ui::Widget *ui; 
}; 

class MyClass : public QObject 
{ 
    Q_OBJECT 

public: 
    MyClass(); 
    void fetch(); 
    QString m_replyStr; 

public slots: 
    void replyFinished(QNetworkReply*); 

private: 
    QNetworkAccessManager* m_manager; 
}; 

#endif // WIDGET_H 

ответ

4

Вы обращающийся m_replyStr из недавно инициированного экземпляра tmp, который делает что-либо в его m_replyStr не установлен. Таким образом, оно имеет инициализированное по умолчанию значение «пустая строка».

EDIT

Основываясь на ваш последующий вопрос, возможно, вы ищете что-то вроде этого?

class MyClass; 

class Widget : public QWidget 
{ 
    Q_OBJECT 

public: 
    Widget(MyClass &myClassInstance, QWidget *parent = 0); 
    ~Widget(); 

private slots: 
    void on_pushButton_clicked(); 

private: 
    Ui::Widget *ui; 
    MyClass *myClass; 
}; 

Widget::Widget(MyClass &myClassInstance, QWidget *parent = 0) 
    : QWidget(parent) 
    , ui(new Ui::Widget) 
    , myClass(&myClassInstance) 
{ 
    ui->setupUi(this); 
} 

void Widget::on_pushButton_clicked() 
{ 
    int myNumber = myClass->m_replyStr.toInt(); 
    ui->lcdNumber->display(myNumber); 
} 
+0

Можете ли вы рассказать мне, как получить доступ к классу, не создавая новый экземпляр? –

+0

@UlfricStorm Этот вопрос не имеет смысла. Класс - это тип, набор свойств (= данных и функций), которые имеют его экземпляры. Это как просить «как получить доступ к' int', не создавая целочисленную переменную? » Если вы хотите, чтобы «Виджет» представлял состояние экземпляра «MyClass», создайте экземпляр «MyClass» и сделайте экземпляр «Widget» осведомленным об этом. Скорее всего, предоставив «Виджет» члену данных типа (умный) указатель на «MyClass» и соответствующим образом заполнив его. – Angew

+0

@UlfricStorm Я добавил пример ответа. – Angew