所以即时制作这个货币计算器,我在比较我的comboBox中选择的值和存储货币汇率的地图时遇到了一些麻烦。
(我不会发布地图插入和组合框的代码更具说明性,假设它们不是空的。)
的.cpp
class Calculator : public QObject
{
Q_OBJECT
public:
explicit Calculator(QMap <QString, double> &my_map,QObject *parent = 0);
void get_value();
private:
Ui::MainWindow *ui;
QMap <QString, double> *map_pointer;
signals:
public slots:
};
·H
Calculator::Calculator(QMap<QString, double> &my_map, QObject *parent) :
QObject(parent)
{
map_pointer=&my_map;
}
void Calculator::get_value()
{
QMap<QString, double>::Iterator i;
qDebug()<< "im in get_value";
for(i=map_pointer->begin(); i !=map_pointer->end();i++)
if(i.key()==ui.>comboBox->currentText())
qDebug()<<i.key() << ": " << i.value();
}
应用程序在if语句中崩溃并出现“意外完成”
和我的主要
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMap<QString,double> currency_map;
MainWindow w(currency_map);
w.show();
Calculator c(currency_map);
c.get_value();
return a.exec();
}
答案 0 :(得分:1)
成员ui
未初始化,因此在访问时会导致未定义的行为。在您的情况下,应用程序崩溃。
在访问实例之前,必须初始化指向Ui::MainWindow
实例的指针。一个简单的方法是在构造函数中传递窗口,如下所示:
// in .h
explicit Calculator(QMap <QString, double> &my_map, Ui::MainWindow *window, QObject *parent = 0);
// in .cpp
Calculator::Calculator(QMap<QString, double> &my_map, Ui::MainWindow *window, QObject *parent) :
QObject(parent)
{
map_pointer=&my_map;
ui = window;
}
但是,我建议你重组你的程序。让计算器依赖于GUI是一个糟糕的设计。相反,您应该向get_value
方法添加一个参数,如下所示:
void Calculator::get_value(QString value) {
for(QMap<QString, double>::Iterator i = map_pointer->begin(); i != map_pointer->end(); ++i) {
if(i.key() == value) {
qDebug()<<i.key() << ": " << i.value();
}
}
}
调用此函数时传递ui->comboBox->currentText()
值。
创建者的自动完成机制建议ui的所有成员,因为它被定义为指向Ui::MainWindow
实例的指针。这意味着,可以通过该指针访问其成员, iff 指向实例。但是,它不会检查程序是否在运行时正确初始化指针。
您可以使用像valgrind这样的代码分析工具来指出这些问题