2013-06-20 42 views
0

我想將QString從另一個類toInt轉換,但由於結果爲0而接口失敗,而應該是5,而其餘代碼工作。 因爲我是C/Qt新手,發現類有點混亂,所以我認爲我的類在做錯了。從另一個類轉換QString時,QString :: toInt()失敗

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

你訪問一個新初始化實例tmp,不設置任何東西到了m_replyStrm_replyStr。所以它具有「空字符串」的默認初始值。

編輯根據您的後續問題

,也許你正在尋找這樣的事情?

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」?如果你想要一個'Widget'來表示'MyClass'的一個實例的狀態,創建一個'MyClass'實例並讓'Widget'實例知道它。最有可能的方法是給Widget一個類型爲(My)的智能指針的數據成員並相應地填充它。 – Angew

+0

@UlfricStorm我已經給答案添加了一個例子。 – Angew