项目介绍
本篇文章的内容是计算器的第三个功能——进制转换,这个功能相比上一个功能——三角函数的实现略微困难一些。程序的逻辑从理论上说只要修改界面和部分槽函数就可以实现2-36任意进制互相转换,这里只实现了二进制(bin)、八进制(oct)、十进制(dec)、十六进制(hex)的互相转换。
界面设计
这是界面的设计图:
控件描述 | 控件名称 |
---|---|
输入框 | inputText |
输出框 | outputText |
输入二进制 | binI |
输出二进制 | binO |
输入八进制 | octI |
输出八进制 | octO |
输入十进制 | decI |
输出十进制 | decO |
输入十六进制 | hexI |
输出十六进制 | hexO |
转换按钮 | btnChange |
控件名称 | 信号函数 | 槽函数 | 槽函数参数 |
---|---|---|---|
binI | QRadioButton::clicked() | baseChange::baseRadioChanged() | QString “I”, QString “bin” |
octI | QRadioButton::clicked() | baseChange::baseRadioChanged() | QString “I”, QString “oct” |
decI | QRadioButton::clicked() | baseChange::baseRadioChanged() | QString “I”, QString “dec” |
hexI | QRadioButton::clicked() | baseChange::baseRadioChanged() | QString “I”, QString “hex” |
binO | QRadioButton::clicked() | baseChange::baseRadioChanged() | QString “O”, QString “bin” |
octO | QRadioButton::clicked() | baseChange::baseRadioChanged() | QString “O”, QString “oct” |
decO | QRadioButton::clicked() | baseChange::baseRadioChanged() | QString “O”, QString “dec” |
hexO | QRadioButton::clicked() | baseChange::baseRadioChanged() | QString “O”, QString “hex” |
btnChange | QPushButton::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多功能计算器(三)——进制转换
发布评论