Qt在Linux中无法正确读取字符串

Qt doesn't read a string properly in Linux

本文关键字:读取 字符串 Linux Qt      更新时间:2023-10-16

好吧,我会尽力解释的。我有一个名为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*表达式

的类的尝试

这是对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;

在控制台下,EP[t]. op。atof()函数后,操作值为"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 value = 2.5,但Qt下为2

可能是bug?有人能证实吗?

谢谢

我怀疑区域设置起了作用。可能您的系统区域设置是某种欧洲语言,其中小数分隔符是逗号,而不是点。

要验证我的悬架,您可以:

  • 尝试在测试期间使用逗号(,)作为小数分隔符或
  • 暂时将您的系统语言环境更改为US(或其他语言,点是十进制分隔符),然后重新运行您的软件。
  • 你可以在日志中打印这个变量的值(见文档):

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

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


我写了一些测试应用程序来验证我的悬架,我是对的,我写了这个插槽:

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考虑了系统区域设置。

你能告诉功能evaluar()是否工作良好,当你这样做:

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

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

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

但是,当您使用toLocal8bit()函数时,QStringconst char*之间的转换效果最好,因为您已经做过一次。

谢谢你的回答。

我试图改变我的程序的环境,添加一个QLocale指针,并使其在构造函数:

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

我已经明确地为我的国家/地区改变了这个值:

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

我还尝试在两种环境(西班牙和美国)的小数点之间更改"。"answers","

在另一个头痛之后,你给了我一个想法,从stringstream对象中获取float valor,而不使用atof()函数。

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

现在它工作得很好。实际上我还没有解决这个问题(语言环境问题),但我绕过它来修复它。我必须在帖子上标记"已解决"吗?

再次感谢您!