我在阅读我的地图数据时遇到问题,甚至可能写入。
我正在制作的应用是基本货币转换器。
我从网站下载汇率,将其保存到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> ¤cy_map);
void multiply();
void getValues(QString strFrom, QString strTo);
double getTotal();
private:
double total, firstCurr, secondCurr;
QMap<QString,double> ↦
};
的.cpp
#include "calculator.h"
Calculator::Calculator(QMap<QString,double> ¤cy_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> ¤cy_map, QWidget *parent = 0);
~MainWindow();
private slots:
void on_convert_button_clicked();
private:
Ui::MainWindow *ui;
Calculator calc;
};
的.cpp
MainWindow::MainWindow(QMap<QString, double> ¤cy_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
答案 0 :(得分:0)
您的计算器有一个成员变量,它是参考到货币值的QMap
。如果它引用的QMap
超出范围,则引用变为无效。将计算器类中成员变量的声明更改为:
QMap<QString,double> map;
这将复制地图而不是引用它。我还会在计算器构造函数中放置一个断点,并验证该点在该点仍然具有有效数据。