实现效果:

主要文件:BtD_DtB_converter.cpp
#include "BtD_DtB_converter.h"
#include <qpushbutton.h>
#include <qlineedit.h>
#include <qstring.h>
# pragma execution_character_set("utf-8")
BtD_DtB_converter::BtD_DtB_converter(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);this->setFixedSize(780, 400);//创造两个转换按钮QPushButton* convert1 = new QPushButton(this);convert1->setGeometry(300, 100, 110, 50);convert1->setText("二进制到十进制");QPushButton* convert2 = new QPushButton(this);convert2->setGeometry(300, 200, 110, 50);convert2->setText("十进制到二进制");//创造四个输入框LineEditQLineEdit* B_to_D_start = new QLineEdit(this);B_to_D_start->setGeometry(100, 100, 100, 50);QLineEdit* B_to_D_end = new QLineEdit(this);B_to_D_end->setGeometry(500, 100, 100, 50);QLineEdit* D_to_B_start = new QLineEdit(this);D_to_B_start->setGeometry(100, 200, 100, 50);QLineEdit* D_to_B_end = new QLineEdit(this);D_to_B_end->setGeometry(500, 200, 100, 50);//连接两个点击信号和槽函数//二进制转换为十进制connect(convert1, &QPushButton::clicked, [=](){QString str_start = B_to_D_start->text();//先查找是否有小数点//如果没有小数点 只使用int数据类型存放即可double NUM_END = 0;double power = 1;if (str_start.indexOf('.') == -1){for (int i = str_start.length()-1; i >= 0; i--){NUM_END += power * (str_start[i] == '1' ? 1:0);power *= 2;}}//最后显示在右边的搜索框中else{power = 1 / (pow(2, str_start.length() - 1 - str_start.indexOf('.')));for (int i = str_start.length() - 1; i > str_start.indexOf('.'); i--){NUM_END += power * (str_start[i] == '1' ? 1 : 0);power *= 2;}//计算小数部分结束,计算整数部分power = 1;for (int i = str_start.indexOf('.') - 1; i >= 0; i--){NUM_END += power * (str_start[i] == '1' ? 1 : 0);power *= 2;}}B_to_D_end->setText(QString::number(NUM_END));});//十进制转换为二进制connect(convert2, &QPushButton::clicked, [=](){//如果没有小数点QString str_start = D_to_B_start->text();QString str_end = "";//先查找是否有小数点//如果没有小数点 只使用int数据类型存放即可int NUM_END = 0;int power = 2;if (str_start.indexOf('.') == -1){int NUM = str_start.toInt();for (; NUM != 0; ){str_end.append(QString::number(NUM % 2));NUM /= 2;}}//如果有小数点else{double NUM2 = str_start.toDouble();int NUM = NUM2;//NUM为整数部分,与前兼容NUM2 = NUM2 - NUM;//保留的小数部分后面进行处理.for (; NUM != 0; ){str_end.append(QString::number(NUM % 2));NUM /= 2;}//反转for (int i = 0; i < str_end.length() / 2; i++){QChar temp = str_end[i];str_end[i] = str_end[str_end.length() - 1 - i];str_end[str_end.length() - 1 - i] = temp;}//添加小数点str_end.append('.');//添加小数部分int NUMofLeft;//乘2后的整数部分for (; NUM2 != 0; ){NUM2 *= 2;NUMofLeft = NUM2;str_end.append(QString::number(NUMofLeft));NUM2 = NUM2 - NUMofLeft;//减去整数部分.}D_to_B_end->setText((str_end));return;}//最后显示在右边的搜索框中 注意要反转 注意:使用的是QChar而不是QChar的引用!for (int i = 0; i < str_end.length()/2; i++){QChar temp = str_end[i];str_end[i] = str_end[str_end.length() - 1 - i];str_end[str_end.length() - 1 - i] = temp;}D_to_B_end->setText((str_end));});
}BtD_DtB_converter::~BtD_DtB_converter()
{}
总结:
- 对算数溢出的部分尚未关注,数字较大时要切换为long或者longlong或者用算法来改进.
- 使用QChar而不是QCharRef进行交换.(Ref是引用
- 对于十进制切换为二进制,尚未设置一个明确的精度,用的可能是QLineEdit的最大宽度(存疑
- indexof找到QString对应的小数点的位置,xx?a:b ,toInt,QString::number()等方法的应用.
- pow()方法与power易混淆,以后起名尽量不使用power.
- 带有UTF-8和BOM的编码时,使用# pragma execution_character_set("utf-8")