【问题标题】:QString::toInt() fails when converting a QString from another class从另一个类转换 QString 时,QString::toInt() 失败
【发布时间】:2013-06-20 16:59:49
【问题描述】:

我想从另一个类toInt 转换一个QString,但它接缝失败,因为结果是 0 而它应该是 5 并且其余代码工作。 因为我是 C/Qt 的新手并且发现类有点混乱,所以我认为我的类做错了。

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;
}

小部件.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

【问题讨论】:

    标签: c++ qt qt5 qtnetwork


    【解决方案1】:

    您正在访问一个新初始化的实例tmpm_replyStr,它没有在其m_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);
    }
    

    【讨论】:

    • 你能告诉我如何在不创建新实例的情况下访问类吗?
    • @UlfricStorm 这个问题没什么意义。类是一种类型,是其实例所具有的一组属性(= 数据和函数)。这就像问“如何在不创建整数变量的情况下访问int?”如果您希望Widget 表示MyClass 实例的状态,请创建MyClass 实例并让Widget 实例知道它。很可能通过给Widget 一个指向MyClass 的类型(智能)指针的数据成员并相应地填充它。
    • @UlfricStorm 我在答案中添加了一个示例。
    • 感谢您的解释,现在我在做什么更清楚了;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多