将映射键与 comboBox.currentText() 进行比较时应用程序崩溃;
App crashing when comparing map key to a comboBox.currentText();
所以我正在制作这个货币计算器,我 运行 在比较我的组合框中选择的值和存储货币汇率的地图时遇到了一些麻烦。
(我不会 post 地图插入和组合框的代码更具体,假设它们不为空。)
.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();
}
应用程序在 "unexpectedly finished"
的 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();
}
成员 ui
未初始化,因此在访问它时会导致未定义的行为。在您的情况下,应用程序崩溃了。
您必须先初始化指向 Ui::MainWindow
实例的指针,然后才能访问它。一种简单的方法是在构造函数中传递 window,如下所示:
// 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这样的代码分析工具来指出这些问题
所以我正在制作这个货币计算器,我 运行 在比较我的组合框中选择的值和存储货币汇率的地图时遇到了一些麻烦。
(我不会 post 地图插入和组合框的代码更具体,假设它们不为空。)
.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();
}
应用程序在 "unexpectedly finished"
的 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();
}
成员 ui
未初始化,因此在访问它时会导致未定义的行为。在您的情况下,应用程序崩溃了。
您必须先初始化指向 Ui::MainWindow
实例的指针,然后才能访问它。一种简单的方法是在构造函数中传递 window,如下所示:
// 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这样的代码分析工具来指出这些问题