无法读取我的地图数据

时间:2015-07-15 15:02:29

标签: c++ qt oop

我在阅读我的地图数据时遇到问题,甚至可能写入。

我正在制作的应用是基本货币转换器。

我从网站下载汇率,将其保存到txt文件中,然后我将其解析以将值保存到地图中并使用我的计算器类进行转换。

下载程序类完美无缺(我得到了官方QT论坛)所以我不会发布它,因为问题不在那里。

代码:main.cpp

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QMap<QString,double> currency_map;

    downloader d;
    d.Do_download();

    parser p;
    p.read_line(currency_map);

    p.print_map(currency_map);// this line works, and it prints out the map

    MainWindow w(currency_map);
    w.show();

    return a.exec();
};

parser.cpp 我很确定它运作良好,因为print_map函数可以完成它的工作。

void parser::process_line(QString line, QMap<QString, double> &my_map)
{

    QStringList temporary_list;

    for(int i = 0; i< currency_list.size();i++)
        {
        if(line.contains(currency_list.at(i),Qt::CaseInsensitive))
            {

            temporary_list=line.split(" ",QString::SkipEmptyParts);

            temporary_list.replaceInStrings(",",".");
            my_map.insert(currency_list.at(i),temporary_list[6].toDouble());
        }
    }

}

int parser::read_line(QMap<QString, double> &my_map)
{

    QFile file("C:/Qt/test/downloaded.txt");

    if(!file.exists())
        {
        QMessageBox msgBox;
        msgBox.setText("There is no such file");
        msgBox.exec();
        return 1;
    }    
    if(!file.open(QIODevice::ReadOnly  | QIODevice::Text))
    {
        QMessageBox msgBox;
        msgBox.setText("Error while opening file");
        msgBox.exec();
        return 1;
    }

    QTextStream in_stream(&file);
    QString line=in_stream.readLine();

    while (!line.isNull())
        {
        process_line(line, my_map);
        line = in_stream.readLine();
    }
    return 0;
}

void parser::print_map(QMap<QString, double> &my_map)
{
   QMapIterator<QString, double> i(my_map);
    while(i.hasNext())
        {
        i.next();
        qDebug()<< i.key() << ": " << i.value();
    }   
}

现在我有一个计算器类:

·H

class Calculator
{
public:
    explicit Calculator(QMap<QString,double> &currency_map);
    void multiply();
    void getValues(QString strFrom, QString strTo);
    double getTotal();
private:
    double total, firstCurr, secondCurr;
    QMap<QString,double> &map;

};

的.cpp

#include "calculator.h"

Calculator::Calculator(QMap<QString,double> &currency_map):map(currency_map)
{
    total = 0;
    firstCurr = 0;
    secondCurr= 0;
}

void Calculator::getValues(QString strFrom, QString strTo)
{
    QMap<QString, double>::iterator i;
    for(i=map.begin();i!=map.end();i++)
        {

            if(!i.key().compare(strFrom))
                firstCurr=i.value();
            if(!i.key().compare(strTo))
                secondCurr = i.value();
    }
        //firstCurr = 2;
        //secondCurr = 3;
}

void Calculator::multiply()
{
    total = firstCurr * secondCurr;
}

double Calculator::getTotal()
{
    return total;
}

然后我在mainWindow类中创建一个Calculator对象 .H

    class MainWindow : public QMainWindow
    {
        Q_OBJECT

    public:
        explicit MainWindow(QMap<QString,double> &currency_map, QWidget *parent = 0);

        ~MainWindow();


    private slots:
        void on_convert_button_clicked();

    private:
        Ui::MainWindow *ui;
        Calculator calc;

    };

的.cpp

MainWindow::MainWindow(QMap<QString, double> &currency_map, QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),calc(currency_map)
{
    ui->setupUi(this);
}

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

void MainWindow::on_convert_button_clicked()
{
    calc.getValues(ui->from_Combox->currentText(),ui->to_Combox->currentText());
    calc.multiply();
    ui->lcdNumber->display(calc.getTotal());
}

但我似乎无法从地图中获取任何值。 奇怪的是,当我调试(我使用visual studio)时,它总是将地图显示为空,这是我无法掌握的,因为打印功能有效。

任何帮助将不胜感激。 THX

1 个答案:

答案 0 :(得分:0)

您的计算器有一个成员变量,它是参考到货币值的QMap。如果它引用的QMap超出范围,则引用变为无效。将计算器类中成员变量的声明更改为:

QMap<QString,double> map;

这将复制地图而不是引用它。我还会在计算器构造函数中放置一个断点,并验证该点在该点仍然具有有效数据。