将map键与comboBox.currentText()进行比较时应用程序崩溃;

时间:2015-06-16 14:47:44

标签: c++ qt combobox

所以即时制作这个货币计算器,我在比较我的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();
}

1 个答案:

答案 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这样的代码分析工具来指出这些问题