Qt编写货币转换按钮槽函数on_btnConvert_clicked编译报错求助
问题根因
4个编译错误全是**槽函数头后面漏了左大括号{**导致的基础语法错误,和你加的KRW、JPY分支逻辑没关系,只是加完代码长度上来之后编译器才抛出明确报错。
你现在的函数开头是这么写的:
void MainWindow::on_btnConvert_clicked() double value, result = 0.0; QString currency; // 后面一堆逻辑
C++规定函数体必须用成对大括号包起来,你只在所有逻辑最后写了右大括号},函数头后面的左大括号完全没写,编译器根本识别不出来后面的代码属于这个槽函数,自然会报一堆「else没有匹配的if」「不允许在函数外写声明」之类的错误,凑够4个和你遇到的情况完全对应。
修复方法
- 先解决编译错误:在
void MainWindow::on_btnConvert_clicked()这行的下一行补上左大括号{就行,补完开头结构如下:
void MainWindow::on_btnConvert_clicked() { double value, result = 0.0; QString currency; // 后面你原来写的代码一行都不用动
就补这一个符号,4个编译错误直接全部消失,程序就能正常编译跑起来。
- 建议顺手修下逻辑bug:你新加的KRW、JPY分支汇率全写反了,现在的数值算出来结果完全不对:
- 韩元的汇率差了3个数量级:1韩元大概换0.00063英镑、0.00077美元、0.00073欧元、0.105日元,你现在写的0.63、0.77相当于1韩元值5块人民币,完全错了
- 日元的转换方向搞反了:1日元大概换0.006英镑、0.0074美元、0.007欧元、9.5韩元,你现在写的166、136相当于1日元值上千元人民币,属于把“1英镑换166日元”反过来写成“1日元换166英镑”了
修正后可直接用的完整代码
void MainWindow::on_btnConvert_clicked() { double value, result = 0.0; QString currency; ui->lblGbp->setText(""); ui->lblUsd->setText(""); ui->lblEur->setText(""); ui->lblJpy->setText(""); ui->lblKrw->setText(""); value = ui->txtAmount->text().toDouble(); currency = ui->cbCurrency->currentText(); if (currency == "GBP") { if(ui->cbGbp->isChecked()) { ui->lblGbp->setText(QString::number(value)+" pound = "+QString::number(value)+" pound"); } if (ui->cbUsd->isChecked()) { result = value*1.22; ui->lblUsd->setText (QString::number(value)+" pound = "+QString::number(result)+" usd"); } if (ui->cbEur->isChecked()) { result = value*1.15; ui->lblEur->setText (QString::number(value)+" pound = "+QString::number(result)+" euro"); } if (ui->cbJpy->isChecked()) { result = value*166; ui->lblJpy->setText (QString::number(value)+" pound = "+QString::number(result)+" yen"); } if (ui->cbKrw->isChecked()) { result = value*1578; ui->lblKrw->setText (QString::number(value)+" pound = "+QString::number(result)+" won"); } } else if (currency == "USD") { if(ui->cbGbp->isChecked()) { result = value*0.81; ui->lblGbp->setText(QString::number(value)+" usd = "+QString::number(result)+" pound"); } if (ui->cbUsd->isChecked()) { ui->lblUsd->setText (QString::number(value)+" usd = "+QString::number(value)+" usd"); } if (ui->cbEur->isChecked()) { result = value*0.94; ui->lblEur->setText (QString::number(value)+" usd = "+QString::number(result)+" euro"); } if (ui->cbJpy->isChecked()) { result = value*135; ui->lblJpy->setText (QString::number(value)+" usd = "+QString::number(result)+" yen"); } if (ui->cbKrw->isChecked()) { result = value*1283; ui->lblKrw->setText (QString::number(value)+" usd = "+QString::number(result)+" won"); } } else if (currency == "EUR") { if(ui->cbGbp->isChecked()) { result = value*0.86; ui->lblGbp->setText(QString::number(value)+" eur = "+QString::number(result)+" pound"); } if (ui->cbUsd->isChecked()) { result = value*1.05; ui->lblUsd->setText (QString::number(value)+" eur = "+QString::number(result)+" usd"); } if (ui->cbEur->isChecked()) { ui->lblEur->setText (QString::number(value)+" eur = "+QString::number(value)+" euro"); } if (ui->cbJpy->isChecked()) { result = value*143; ui->lblJpy->setText (QString::number(value)+" eur = "+QString::number(result)+" yen"); } if (ui->cbKrw->isChecked()) { result = value*1361; ui->lblKrw->setText (QString::number(value)+" eur = "+QString::number(result)+" won"); } } else if (currency == "KRW") { if(ui->cbGbp->isChecked()) { result = value*0.00063; ui->lblGbp->setText(QString::number(value)+" won = "+QString::number(result)+" pound"); } if (ui->cbUsd->isChecked()) { result = value*0.00077; ui->lblUsd->setText (QString::number(value)+" won = "+QString::number(result)+" usd"); } if (ui->cbEur->isChecked()) { result = value*0.00073; ui->lblEur->setText (QString::number(value)+" won = "+QString::number(result)+" euro"); } if (ui->cbJpy->isChecked()) { result = value*0.105; ui->lblJpy->setText (QString::number(value)+" won = "+QString::number(result)+" yen"); } if (ui->cbKrw->isChecked()) { ui->lblKrw->setText (QString::number(value)+" won = "+QString::number(value)+" won"); } } else if (currency == "JPY") { if(ui->cbGbp->isChecked()) { result = value*0.006 ; ui->lblGbp->setText(QString::number(value)+" yen = "+QString::number(result)+" pound"); } if (ui->cbUsd->isChecked()) { result = value*0.0074 ; ui->lblUsd->setText (QString::number(value)+" yen = "+QString::number(result)+" usd"); } if (ui->cbEur->isChecked()) { result = value*0.007 ; ui->lblEur->setText (QString::number(value)+" yen = "+QString::number(result)+" euro"); } if (ui->cbJpy->isChecked()) { ui->lblJpy->setText (QString::number(value)+" yen = "+QString::number(value)+" yen"); } if (ui->cbKrw->isChecked()) { result = value*9.5; ui->lblKrw->setText (QString::number(value)+" yen = "+QString::number(result)+" won"); } } }
另外提一句,你代码里写的ui ->txtAmount这种->两边加空格的写法完全符合C++语法,不用改。
内容的提问来源于stack exchange,提问作者pil pil
相关产品推荐
相关产品推荐

