Qt在Linux中没有正确读取字符串

时间:2014-06-12 08:46:32

标签: c++ linux qt

好吧,我会试着解释一下。 我有一个名为Calc的类,用于计算字符串或const char *数字表达式,如“2 *(3/5)”或类似的。

现在我正在尝试在Qt中构建一个计算器,使用这些类来评估QLineEdit的输入。

班级的工作原理如下:

Calc(const std::string &sExpresion);
Calc(const char* cExpresion);

void anadirExpresion(const std::string &sExpresion);
void anadirExpresion(const char* cExpresion);

我尝试在Qt中使用它:

void Calculadora::evaluar()
{
    QLocale locale;
    QByteArray cadena = ui->pantalla->text().toLocal8Bit();
    const char* expresionAEvaluar = cadena.data();
    qDebug()<<"Cadena a evaluar: "<<cadena;
    std::cout<<"Cadena: "<<expresionAEvaluar<<std::endl;
    evaluador.anadirExpresion(expresionAEvaluar); //evaluador is the class Calc instance
    float resultado=evaluador.CalcularExpresion();
    qDebug()<<"Resultado: "<<resultado;
    ui->pantalla->setText(QString::number(resultado));    
}

尝试使用带有const char *表达式的Class

这是使用std :: string表达式的尝试

void Calculadora::evaluar()
{
    //std::string cadena = ui->pantalla->text().toStdString();
    //qDebug()<<"Cadena a evaluar: "<<ui->pantalla->text();
    std::cout<<"Cadena: "<<ui->pantalla->text().toStdString()<<std::endl;
    evaluador.anadirExpresion(ui->pantalla->text().toStdString());
    float resultado=evaluador.CalcularExpresion();
    qDebug()<<"Resultado: "<<resultado;
    ui->pantalla->setText(QString::number(resultado));    
}

问题是我在“。”之后丢失了数据。字符。 如果我有“2.3”,则计算器执行“2” 此外,这个问题只出现在Linux中,因为在Windows下的Qt中它运行正常。 它在Linux和Windows下的控制台模式下运行良好。

此外,QDebug()和std :: cout的Qt控制台中的输出显示正确的字符串。

建议?

抱歉我的英语很差,感谢先进。

***更新:

最后,我认为这个错误是因为在linux下的Qt下编译的函数atof()无法正常工作。我听起来毫无意义但是,我按照“2.5”值来寻找改变的地方,之后它改变了(改为Calc的成员函数)

EP[t].OP.operando=atof(aux);
std::cout<<"changed? "<<aux<<std::endl;
std::cout<<"changed: "<<EP[t].OP.operando<<std::endl;

在控制台下,atof()函数后,EP [t] .OP.operando值为“2.5”。 在Windows中也是如此。 但是在Linux中,我获得了“2”的价值。

现在我再试一次:

char cad[]="2.5";
EP[t].OP.operando=atof(cad);
std::cout<<"changed: "<<EP[t].OP.operando<<std::endl;

在控制台下,EP [t] .OP.operando值= 2.5,但在Qt下是2

也许是个错误?有人确认吗?

谢谢

3 个答案:

答案 0 :(得分:1)

我怀疑语言环境会发生。可能你的系统语言环境是某种欧洲语言,其中小数点分隔符是逗号,而不是点。

要验证我的暂停,您可以:

  • 在测试期间尝试使用逗号(,)作为小数点分隔符或
  • 暂时将您的系统区域设置更改为美国(或其他小数点分隔符的语言),然后重新运行您的软件。
  • 您可以在日志中打印此变量的值(see documentation):

    qDebug() << "Decimal separator: " << localeconv()->decimal_point;
    

如果我是对的,那么这不是一个错误,而是一个功能:)。

<小时/> 我写了一些测试应用程序来验证我的暂停,我是对的,我写了这个插槽:

void MainWindow::processText(const QString &txt)
{
    std::string s = txt.toStdString();
    std::stringstream stream(s);
    double x;
    x = std::atof(s.c_str());
    emit atofResultString(QString::number(x));
    if (stream >> x) {
        emit stdstreamResult(QString::number(x));
    }
}

我在Ubuntu 12.04上使用波兰语语言环境设置测试了这个。结果是atof考虑了系统区域设置。

答案 1 :(得分:0)

完成后,您能告诉函数evaluar()是否正常工作:

QByteArray cadena = ui->pantalla->text().toLocal8Bit(); const char* expresionAEvaluar = cadena.data();

如果它正常工作,那么我建议你也为std::string使用相同的功能。 这可以使用std::string::c_str()完成。

所以你可以写ui->pantalla->text().toStdString().c_str()

但是,当您使用QString函数时,const char*toLocal8bit()之间的转换效果最佳。

答案 2 :(得分:0)

谢谢你的回答。

我试图改变程序的环境,添加一个QLocale指针并在constuctor中进行:

valor = new QLocale (QLocale::C,QLocale::UnitedStates);//valor is a QLocale pointer

我已明确更改了我的国家/地区的此值:

valor = new QLocale (QLocale::Spanish,QLocale::Spain);

我也尝试在“。”之间切换。和“,”表示两种环境(西班牙和美国)的小数点

经过另一次头痛之后,你给了我一个想法,从字符串流对象中获取浮点值,而不是使用atof()函数。

std::stringstream ss(aux);
ss>>EP[t].OP.operando;

现在它工作正常。 实际上我没有解决问题(Locale问题),但我解决了这个问题。 我必须像SOLVED一样标记帖子吗?

再次感谢你!