项目介绍


本篇文章的内容是计算器的第三个功能——进制转换,这个功能相比上一个功能——三角函数的实现略微困难一些。程序的逻辑从理论上说只要修改界面和部分槽函数就可以实现2-36任意进制互相转换,这里只实现了二进制(bin)、八进制(oct)、十进制(dec)、十六进制(hex)的互相转换。

界面设计

这是界面的设计图:

控件描述控件名称
输入框inputText
输出框outputText
输入二进制binI
输出二进制binO
输入八进制octI
输出八进制octO
输入十进制decI
输出十进制decO
输入十六进制hexI
输出十六进制hexO
转换按钮btnChange
控件名称信号函数槽函数槽函数参数
binIQRadioButton::clicked()baseChange::baseRadioChanged()QString “I”, QString “bin”
octIQRadioButton::clicked()baseChange::baseRadioChanged()QString “I”, QString “oct”
decIQRadioButton::clicked()baseChange::baseRadioChanged()QString “I”, QString “dec”
hexIQRadioButton::clicked()baseChange::baseRadioChanged()QString “I”, QString “hex”
binOQRadioButton::clicked()baseChange::baseRadioChanged()QString “O”, QString “bin”
octOQRadioButton::clicked()baseChange::baseRadioChanged()QString “O”, QString “oct”
decOQRadioButton::clicked()baseChange::baseRadioChanged()QString “O”, QString “dec”
hexOQRadioButton::clicked()baseChange::baseRadioChanged()QString “O”, QString “hex”
btnChangeQPushButton::clicked()baseChange::changeBtnPushed()None
//baseChange.h
void baseRadioChanged(QString io, QString base);
void changeBtnPushed();
//baseChange.cpp
connect(ui->binI,&QRadioButton::clicked,this,[=]{baseChange::baseRadioChanged("I","bin");});
connect(ui->octI,&QRadioButton::clicked,this,[=]{baseChange::baseRadioChanged("I","oct");});
connect(ui->decI,&QRadioButton::clicked,this,[=]{baseChange::baseRadioChanged("I","dec");});
connect(ui->hexI,&QRadioButton::clicked,this,[=]{baseChange::baseRadioChanged("I","hex");});
connect(ui->binO,&QRadioButton::clicked,this,[=]{baseChange::baseRadioChanged("O","bin");});
connect(ui->octO,&QRadioButton::clicked,this,[=]{baseChange::baseRadioChanged("O","oct");});
connect(ui->decO,&QRadioButton::clicked,this,[=]{baseChange::baseRadioChanged("O","dec");});
connect(ui->hexO,&QRadioButton::clicked,this,[=]{baseChange::baseRadioChanged("O","hex");});
connect(ui->btnChange,&QPushButton::clicked,this,[=]{baseChange::changeBtnPushed();});

界面逻辑

baseRadioChanged()函数

void baseChange::baseRadioChanged(QString io, QString base)
{
    if(io == "I"){
        inputBase = base;
    }
    else{
        outputBase = base;
    }
}

处理单选框内容被更改的事件,将对应全局变量赋值为对应的进制。

changeBtnPushed()函数

void baseChange::changeBtnPushed()
{
    ui->outputText->setText("");
    int number;
    int base;
    QString result;
    bool isChangeSuccessful;
    if(inputBase == "bin"){
        base = 2;
    }
    else if(inputBase == "oct"){
        base = 8;
    }
    else if(inputBase == "dec"){
        base = 10;
    }
    else{
        base = 16;
    }
    number = ui->inputText->text().toInt(&isChangeSuccessful,base);
    if(isChangeSuccessful){
        if(outputBase == "bin"){
            result = QString("%1").arg(number,0,2);
        }
        else if(outputBase == "oct"){
            result = QString("%1").arg(number,0,8);
        }
        else if(outputBase == "dec"){
            result = QString("%1").arg(number,0,10);
        }
        else{
            result = QString("%1").arg(number,0,16);
        }
        ui->outputText->setText(result);
    }
    else{
        QMessageBox::information(NULL,"提示","请输入正确的数字");
    }
}

在转换按钮被按下后,在输出框显示对应的值。

知识整理

QString::toInt()函数

在发现这个进制转换方法之前,我尝试过在字符串的前面加进制前缀以及使用格式化符进行格式化(QString似乎只支持一部分格式化符)。通过看官方文档,我了解到了这个方法。
原文

翻译
int QString::toInt(bool *ok= nullptr, int base = 10) const
返回被转换成目标进制base的字符串,目标进制默认是10,而且在2和36之间(包括2和36),或者0。如果转换错误,会返回0。
如果nullptr参数指向的是布尔型变量ok,转换失败时,ok的值会变成false,反之,转换成功时,ok的值会变成true
如果base参数的值是0,C语言的规则会被使用:如果字符串以"0x"开头,将会被当作16进制数处理;如果字符串以"0"开头,将会被当作8进制数处理;如果没有前缀,将会被当作十进制数处理。
字符串的转换经常会发生在C语言的环境下。对于依赖于语言环境的转换,使用QLocale::toInt()。
示例:

str = "FF";
bool ok;
int hex = str.toInt(&ok, 16);     // hex == 255, ok == true 
int dec = str.toInt(&ok, 10);     // dec == 0, ok == false

这个函数忽略字符串前后两端的空格。

如果翻译有些问题,请见谅,我只是一个初中生,看不懂的内容都是意译的。

QString格式化

QTextEdit在设置文字时不支持格式化,所以需要在设置之前格式化。

QString string = QString("%1").arg(number, 0, base)
//%1是字符串格式化符号
//number: 插入字符串的数字
//0: 数字最大长度,0表示不限制长度
//base: 数字的目标进制

代码地址

更多推荐

Qt多功能计算器(三)——进制转换