Qt制作进制转换器

前言

Qt制作一个进制转换器分享给大家,有了这个转换器,平时学习遇到进制转换的问题,我们就可以偷懒了~

功能概述

①支持二进制、八进制、十进制、十六进制之间互相转换

②支持浮点数转换以及负数转换

③错误提示,不正确的数值格式,会弹窗警告

④自动去除无效0,最终结果简洁清晰,且可复制

核心思路

利用数据结构中的栈和队列,然后了解各进制之间转换过程即可

整数部分

例如10进制转2进制,就是“除2取余,反向输出”,将每次除2的余数入栈,直至除尽,然后依次出栈就是2进制结果,10转8,16也是同样的原理,注意10转16要输出根据余数10~15输出A~F

2转10就是整数部分从右往左依次将该位上的数值乘2的次方(0开始依次递增),最终的和就是10进制结果,2转8,16也是同样的原理,就是2的次方变成8,16的次方

8转2,整数部分,从右往左,每位直接转换成3位2进制,不足3位,左边补0,8转了2后,拿2进制转10和16就是上面的原理

16转2,整数部分,从右往左,每位直接转换成4位2进制,不足4位,左边补0,16转了2后,拿2进制转10和8就是上面的原理

小数部分

10转2,“乘2取整,顺序输出”,将每次乘2的整数部分入队列,不一定能除尽,所以这里我保留10位小数,最后依次出队就是2进制结果,10转8,16也是同样的原理,“乘8/16取整,顺序输出”

2转10就是小数部分从左往右依次将该位上的数值乘2的次方(-1开始依次递减),最终的和就是10进制结果,2转8,16也是同样的原理,就是2的次方变成8,16的次方

8转2,小数部分,从左往右,每位直接转换成3位2进制,不足3位,右边补0,8转了2后,拿2进制转10和16就是上面的原理

16转2,小数部分,从左往右,每位直接转换成4位2进制,不足4位,右边补0,16转了2后,拿2进制转10和8就是上面的原理

最终将整数部分和小数部分拼接就是最终的结果

项目演示

软件图标

软件界面

进制转换

 小数部分保留10位小数

 

  错误提示

 源代码

#include <QWidget>
#include<QStack>
#include<QQueue>
#include<QDebug>
#include<qmath.h>
#include<QMessageBox>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void two_transition(QString texts);
    void eight_transition(QString texts);
    void ten_transition(QString texts);
    void sixteen_transition(QString texts);
    int twoToeight(QString str);
    int twoTosixteen(QString str);
    QString eightTotwo(int num);
    QString sixteenTotwo(int num);
    QString delete_zero(QString ret);
    void error_tip();

private slots:
    void on_btn_transition_clicked();

    void on_radio_2_clicked();

    void on_radio_8_clicked();

    void on_radio_10_clicked();

    void on_radio_16_clicked();

private:
    Ui::Widget *ui;
    int system_flag = 2;//进制变量
    bool is_minus = false; //判断是否为负数
    bool is_float = false;//判断是否带小数
};
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->setWindowTitle("进制转换器");
    this->setFixedSize(QSize(this->width(),this->height()));
}

Widget::~Widget()
{
    delete ui;
}

void Widget::two_transition(QString texts) //二进制
{
    QStack<int> stack;
    QQueue<int> queue;
    QString text = texts; //整数部分
    QString f_text; //小数部分
    if(is_float)//如果是小数,整数部分和小数部分分开计算
    {
        text = texts.section(".",0,0);
        f_text = texts.section(".",1,1);
    }

  //转二进制
    QString text2 = text;
    if(is_minus)
        text2 = "-"+text2;
    if(is_float)
        text2 = text2 + "."+ f_text;
    text2 = delete_zero(text2);
    ui->le_2->setText(text2);

  //转八进制
    QString text_clone = text; //拷贝
    int len = text_clone.length();
   while(len)
   {
       if(len<3)//若当前位数小于3位,则补0
       {
           while(len!=3)
           {
               text_clone = "0" + text_clone;
               len = text_clone.length();
           }
       }
       QString temp = text_clone.mid(len-3,3);
       int tem_len = temp.length();
       int num = twoToeight(temp);
       stack.push(num); //入栈
      text_clone.remove(len-tem_len,tem_len);//更新字符串
      len = text_clone.length();
   }
   QString num8;//整数部分
   QString f_num8;//小数部分
   while(!stack.empty())
   {
       QString str = QString::number(stack.pop());
       num8 += str;
   }
   if(is_float) //处理小数
   {
       QString f_text_clone = f_text;//拷贝
       int len = f_text_clone.length();
       if(len<3) //长度小于3后位补0
       {
           while(len!=3)
           {
                f_text_clone += "0";
                len = f_text_clone.length();
           }

       }
       while(len)
       {
           QString temp = f_text_clone.mid(0,3);
           if(temp.length()<3)
           {
               while(temp.length()!=3)
               {
                   temp += "0";
               }

           }
           int res = twoToeight(temp);
           queue.enqueue(res);
           f_text_clone.remove(0,3);
           len =  f_text_clone.length();
       }
       while(!queue.empty())
       {
           QString ret = QString::number(queue.dequeue());//出队
           f_num8 += ret;
       }
   }
   if(is_minus)
    num8 = "-"+num8;
   if(is_float)
    num8 = num8 + "." +f_num8;
   num8 = delete_zero(num8);
   ui->le_8->setText(num8);
   //转十进制
   QString text_clone1 = text; //拷贝
   int sum = 0;
   double f_sum = 0; //小数部分和
   int len1 = text_clone1.length();
   for(int i = len1 - 1,k = 0;i>=0;i--,k++)
   {
       QString n = text_clone1.at(i);
       int num = n.toInt();
       int p = num * qPow(2,k);
       sum = sum + p;
   }
   if(is_float) //处理小数
   {
       QString f_text_clone = f_text;//拷贝
       int len = f_text_clone.length();
       for(int i = 0,k = -1;i<len;i++,k--)
       {
           QString num = f_text_clone.at(i);
           double ret = num.toDouble();
           double df = ret * qPow(2,k);
           f_sum+=df;
       }
       //去除头部的0.
       QString t_f_sum = QString::number(f_sum).section(".",1,1);
       f_sum = t_f_sum.toDouble();
   }
   QString temp_sum = QString::number(sum);
   if(is_minus)
   temp_sum = "-" + temp_sum;
   if(is_float)
   temp_sum = temp_sum + "." + QString::number(f_sum);
   temp_sum = delete_zero(temp_sum);
   ui->le_10->setText(temp_sum);
   //转十六进制
   QString text_clone2 = text; //拷贝
   int len2 = text_clone2.length();
  while(len2)
  {
      if(len2<4)//若当前位数小于4位,则补0
      {
          while(len2!=4)
          {
              text_clone2 = "0" + text_clone2;
              len2 = text_clone2.length();
          }
      }
      QString temp = text_clone2.mid(len2-4,4);
      int tem_len = temp.length();
      int num = twoTosixteen(temp);
      stack.push(num); //入栈
     text_clone2.remove(len2-tem_len,tem_len);//更新字符串
     len2 = text_clone2.length();
  }
  QString num16;
  QString f_num16;
  while(!stack.empty())
  {
      QString n = QString::number(stack.pop());
      if(n=="10")
      num16 += "A";
      else if(n=="11")
      num16 += "B";
      else if(n=="12")
      num16 += "C";
      else if(n=="13")
      num16 += "D";
      else if(n=="14")
      num16 += "E";
      else if(n=="15")
      num16 += "F";
      else
      num16 += n;
  }
  if(is_float)//处理小数部分
  {
      QString f_text_clone = f_text;//拷贝
      int len = f_text_clone.length();
      if(len<4) //长度小于4后位补0
      {
          while(len!=4)
          {
               f_text_clone += "0";
               len = f_text_clone.length();
          }

      }
      while(len)
      {
          QString temp = f_text_clone.mid(0,4);
          if(temp.length()<4)
          {
              while(temp.length()!=4)
              {
                  temp += "0";
              }

          }
          int res = twoTosixteen(temp);
          queue.enqueue(res);
          f_text_clone.remove(0,4);
          len =  f_text_clone.length();
      }
      while(!queue.empty())
      {

          QString ret = QString::number(queue.dequeue());//出队
          if(ret=="10")
          f_num16 += "A";
          else if(ret=="11")
          f_num16 += "B";
          else if(ret=="12")
          f_num16 += "C";
          else if(ret=="13")
          f_num16 += "D";
          else if(ret=="14")
          f_num16 += "E";
          else if(ret=="15")
          f_num16 += "F";
          else
          f_num16 += ret;
      }
  }
   if(is_minus)
   num16 = "-"+num16;
   if(is_float)
   num16 = num16 + "." + f_num16;
   num16 = delete_zero(num16);
  ui->le_16->setText(num16);
}

void Widget::eight_transition(QString texts)//八进制
{
    QStack<int> stack;
    QQueue<int> queue;
    QString text = texts;
    QString f_text; //小数部分
    if(is_float)//如果是小数,整数部分和小数部分分开计算
    {
        text = texts.section(".",0,0);
        f_text = texts.section(".",1,1);
    }
   //转二进制
    QStack<QString> qstr_stack;
    QString text_clone = text; //拷贝
    int len = text_clone.length();
    for(int i = len - 1;i>=0;i--)
    {
        QString str = text_clone.at(i);
        int num = str.toInt();
        QString res = eightTotwo(num);
        qstr_stack.push(res);
    }
    QString num2;
    QString f_num2;
    while(!qstr_stack.empty())
    {
        QString tem = qstr_stack.pop();
        num2 += tem;
    }
    if(is_float)//处理小数
    {
        QString f_text_clone = f_text;//拷贝
        int len = f_text_clone.length();
        for(int i = 0;i<len;i++)
         {
            QString ret = f_text_clone.at(i);
            int num = ret.toInt();
            QString str = eightTotwo(num);
            f_num2 += str;
        }
    }
    QString num3 = num2;
    if(is_minus)
        num2 = "-"+num2;
    if(is_float)
        num2 = num2 + "." +f_num2;
    num2 = delete_zero(num2);
    ui->le_2->setText(num2);
    //转八进制
    QString tem_text = text;
    if(is_minus)
    tem_text = "-"+tem_text;
    if(is_float)
    tem_text = tem_text + "." + f_text;
    tem_text = delete_zero(tem_text);
     ui->le_8->setText(tem_text);
    //转十进制
    QString text_clone2 = text; //拷贝
    int len2 = text_clone2.length();
    int sum = 0;
    double f_sum = 0;
    for(int i = len2 - 1,k = 0;i>=0;i--,k++)
    {
        QString str = text_clone2.at(i);
        int num = str.toInt();
        int p = num * qPow(8,k);
        sum += p;
    }
    if(is_float)//处理小数部分
    {
        QString f_text_clone = f_text;//拷贝
        int len = f_text_clone.length();
        for(int i = 0,k = -1;i<len;i++,k--)
        {
            QString num = f_text_clone.at(i);
            double ret = num.toDouble();
            double df = ret * qPow(8,k);
            f_sum+=df;
        }
        //去除头部的0.
        QString t_f_sum = QString::number(f_sum).section(".",1,1);
        f_sum = t_f_sum.toDouble();
    }
    QString tem_sum = QString::number(sum);
    if(is_minus)
        tem_sum = "-" + tem_sum;
    if(is_float)
        tem_sum = tem_sum + "." + QString::number(f_sum);
    tem_sum = delete_zero(tem_sum);
    ui->le_10->setText(tem_sum);
    //转十六
    QString text_clone3 = num3; //拷贝
    int len3 = text_clone3.length();
   while(len3)
   {
       if(len3<4)//若当前位数小于4位,则补0
       {
           while(len3!=4)
           {
               text_clone3 = "0" + text_clone3;
               len3 = text_clone3.length();
           }
       }
       QString temp = text_clone3.mid(len3-4,4);
       int tem_len = temp.length();
       int num = twoTosixteen(temp);
       stack.push(num); //入栈
      text_clone3.remove(len3-tem_len,tem_len);//更新字符串
      len3 = text_clone3.length();
   }
   QString num16;
   QString f_num16;
   while(!stack.empty())
   {
       QString n = QString::number(stack.pop());
       if(n=="10")
       num16 += "A";
       else if(n=="11")
       num16 += "B";
       else if(n=="12")
       num16 += "C";
       else if(n=="13")
       num16 += "D";
       else if(n=="14")
       num16 += "E";
       else if(n=="15")
       num16 += "F";
       else
       num16 += n;
   }
   if(is_float)//处理小数部分
   {
       QString f_text_clone = f_num2;//拷贝
       int len = f_text_clone.length();
       if(len<4) //长度小于4后位补0
       {
           while(len!=4)
           {
                f_text_clone += "0";
                len = f_text_clone.length();
           }

       }
       while(len)
       {
           QString temp = f_text_clone.mid(0,4);
           if(temp.length()<4)
           {
               while(temp.length()!=4)
               {
                   temp += "0";
               }

           }
           int res = twoTosixteen(temp);
           queue.enqueue(res);
           f_text_clone.remove(0,4);
           len =  f_text_clone.length();
       }
       while(!queue.empty())
       {

           QString ret = QString::number(queue.dequeue());//出队
           if(ret=="10")
           f_num16 += "A";
           else if(ret=="11")
           f_num16 += "B";
           else if(ret=="12")
           f_num16 += "C";
           else if(ret=="13")
           f_num16 += "D";
           else if(ret=="14")
           f_num16 += "E";
           else if(ret=="15")
           f_num16 += "F";
           else
           f_num16 += ret;
       }
   }
   if(is_minus)
   num16="-"+num16;
   if(is_float)
   num16 = num16 +"." +f_num16;
   num16 = delete_zero(num16);
   ui->le_16->setText(num16);
}

void Widget::ten_transition(QString texts) //十进制
{
    QStack<int> stack;
    QQueue<int> queue;
    QString text = texts;
    QString f_text; //小数部分
    if(is_float)//如果是小数,整数部分和小数部分分开计算
    {
        text = texts.section(".",0,0);
        f_text = texts.section(".",1,1);
    }
    //转二进制
    int num = text.toInt();
    while(num)
    {
        int temp = num%2;
        stack.push(temp);//余数入栈
        num = num/2;
    }
    QString str;
    QString f_str;
    int count = 0;//计数器(保留10位小数)
    while(!stack.empty())
    {
        QString n = QString::number(stack.pop());
        str += n;
    }
    if(is_float)//处理小数部分
    {
        QString f_text_clone = f_text;//拷贝
        int len = f_text_clone.length();
         f_text_clone = "0."+f_text_clone;
        double num = f_text_clone.toDouble();
        double ret = num;
        while(ret&&count!=10)
        {
            ret = ret*2;
            if(ret>=1)
            {
                queue.enqueue(1);
                ret -= 1;
            }
            else
            {
                queue.enqueue(0);
            }
            count++;
        }
        while (!queue.empty())
        {
            QString s = QString::number(queue.dequeue());
            f_str += s;
        }
    }
    if(is_minus)
        str = "-"+str;
    if(is_float)
        str = str + "." +f_str;
    str = delete_zero(str);
    ui->le_2->setText(str);
    //转八进制
    int num8 = text.toInt();
    while(num8)
    {
        int temp = num8%8;
        stack.push(temp);//余数入栈
        num8 = num8/8;
    }
    QString str8;
    QString f_str8;//小数部分
    count = 0;//计数器清0
    while(!stack.empty())
    {
        QString n = QString::number(stack.pop());
        str8 += n;
    }
    if(is_float)//处理小数部分
    {
        QString f_text_clone = f_text;//拷贝
        int len = f_text_clone.length();
         f_text_clone = "0."+f_text_clone;
        double num = f_text_clone.toDouble();
        double ret = num;
        while(ret&&count!=10)
        {
            ret = ret*8;
            if(ret>=1)
            {
                QString tem = QString::number(ret);
                int rs = tem.section(".",0,0).toInt();
                ret -= rs;
                queue.enqueue(rs);
            }
            else
            {
                queue.enqueue(0);
            }
            count++;
        }
        while (!queue.empty())
        {
            QString s = QString::number(queue.dequeue());
            f_str8 += s;
        }
    }
    if(is_minus)
        str8 = "-"+str8;
    if(is_float)
        str8 = str8 +"."+f_str8;
     str8 = delete_zero(str8);
     ui->le_8->setText(str8);
      //转十进制
     QString tem_t = text;
     if(is_minus)
         tem_t = "-"+tem_t;
     if(is_float)
         tem_t = tem_t +"."+ f_text;
      tem_t = delete_zero(tem_t);
         ui->le_10->setText(tem_t);
     //转十六
     int num16 = text.toInt();
     while(num16)
     {
         int temp = num16%16;
         stack.push(temp);//余数入栈
         num16 = num16/16;
     }
     QString str16;
     QString f_str16;//小数部分
     count = 0;//计数器清0
     while(!stack.empty())
     {
         QString n = QString::number(stack.pop());
         if(n=="10")
         str16 += "A";
         else if(n=="11")
         str16 += "B";
         else if(n=="12")
         str16 += "C";
         else if(n=="13")
         str16 += "D";
         else if(n=="14")
         str16 += "E";
         else if(n=="15")
         str16 += "F";
         else
         str16 += n;
     }
     if(is_float)//处理小数部分
     {
         QString f_text_clone = f_text;//拷贝
         int len = f_text_clone.length();
          f_text_clone = "0."+f_text_clone;
         double num = f_text_clone.toDouble();
         double ret = num;
         while(ret&&count!=10)
         {
             ret = ret*16;
             if(ret>=1)
             {
                 QString tem = QString::number(ret);
                 int rs = tem.section(".",0,0).toInt();
                 ret -= rs;
                 queue.enqueue(rs);
             }
             else
             {
                 queue.enqueue(0);
             }
             count++;
         }
         while (!queue.empty())
         {
             QString n = QString::number(queue.dequeue());
             if(n=="10")
             f_str16 += "A";
             else if(n=="11")
             f_str16 += "B";
             else if(n=="12")
             f_str16 += "C";
             else if(n=="13")
             f_str16 += "D";
             else if(n=="14")
             f_str16 += "E";
             else if(n=="15")
             f_str16 += "F";
             else
             f_str16 += n;
         }
     }
     if(is_minus)
         str16 = "-" + str16;
     if(is_float)
         str16 = str16 +"."+f_str16;
     str16 = delete_zero(str16);
     ui->le_16->setText(str16);
}

void Widget::sixteen_transition(QString texts)//十六进制
{

    QStack<int> stack;
    QQueue<int> queue;
    QStack<QString> qstr_stack;
    QQueue<QString> qstr_queue;
    QString text = texts;
    QString f_text;
    if(is_float)//如果是小数,整数部分和小数部分分开计算
    {
        text = texts.section(".",0,0);
        f_text = texts.section(".",1,1);
    }
   //转二进制
    QString text_clone = text;
    int len = text_clone.length();
    for(int i = len-1;i>=0;i--)
    {
        int num;
        QString str = text_clone.at(i);
        if(str=="A"||str=="a")
            num=65;
        else if(str=="B"||str=="b")
            num=66;
        else if(str=="C"||str=="c")
            num=67;
        else if(str=="D"||str=="d")
            num=68;
        else if(str=="E"||str=="e")
            num=69;
        else if(str=="F"||str=="f")
            num=70;
        else
         num = str.toInt();
        QString res = sixteenTotwo(num);
        qstr_stack.push(res);
    }
    QString num2;
    QString f_num2;
    while(!qstr_stack.empty())
    {
        QString str = qstr_stack.pop();
        num2 += str;
    }
    QString num3 = num2;
    if(is_float)//处理小数部分
    {
        QString f_text_clone = f_text;//拷贝
        int len = f_text_clone.length();
        for(int i = 0;i<len;i++)
        {
            QString ret = f_text_clone.at(i);
            int num =ret.toInt();
            QString res = sixteenTotwo(num);
            qstr_queue.enqueue(res);
        }
        while(!qstr_queue.empty())
        {
            QString s = qstr_queue.dequeue();
            f_num2 += s;
        }
    }
    if(is_minus)
        num2 = "-"+num2;
    if(is_float)
        num2 = num2 +"."+f_num2;
    num2 = delete_zero(num2);
    ui->le_2->setText(num2);
    //转八进制
    QString text_clone1 = num3; //拷贝
    int len1 = text_clone1.length();
   while(len1)
   {
       if(len1<3)//若当前位数小于3位,则补0
       {
           while(len1!=3)
           {
               text_clone1 = "0" + text_clone1;
               len1 = text_clone1.length();
           }
       }
       QString temp = text_clone1.mid(len1-3,3);
       int tem_len = temp.length();
       int num = twoToeight(temp);
       stack.push(num); //入栈
      text_clone1.remove(len1-tem_len,tem_len);//更新字符串
      len1 = text_clone1.length();
   }
   QString num8;
   QString f_num8;
   while(!stack.empty())
   {
       QString str = QString::number(stack.pop());
       num8 += str;
   }
   if(is_float) //处理小数
   {
       QString f_text_clone = f_num2;//拷贝
       int len = f_text_clone.length();
       if(len<3) //长度小于3后位补0
       {
           while(len!=3)
           {
                f_text_clone += "0";
                len = f_text_clone.length();
           }

       }
       while(len)
       {
           QString temp = f_text_clone.mid(0,3);
           if(temp.length()<3)
           {
               while(temp.length()!=3)
               {
                   temp += "0";
               }

           }
           int res = twoToeight(temp);
           queue.enqueue(res);
           f_text_clone.remove(0,3);
           len =  f_text_clone.length();
       }
       while(!queue.empty())
       {
           QString ret = QString::number(queue.dequeue());//出队
           f_num8 += ret;
       }
   }
   if(is_minus)
       num8 = "-"+num8;
   if(is_float)
       num8 = num8+"."+f_num8;
   num8 = delete_zero(num8);
   ui->le_8->setText(num8);
   //转十进制
   QString text_clone2 = num3; //拷贝
   int sum = 0;
   double f_sum = 0;
   int len2 = text_clone2.length();
   for(int i = len2 - 1,k = 0;i>=0;i--,k++)
   {
       QString n = text_clone2.at(i);
       int num = n.toInt();
       int p = num * qPow(2,k);
       sum = sum + p;
   }
   if(is_float) //处理小数
   {
       QString f_text_clone = f_num2;//拷贝
       int len = f_text_clone.length();
       for(int i = 0,k = -1;i<len;i++,k--)
       {
           QString num = f_text_clone.at(i);
           double ret = num.toDouble();
           double df = ret * qPow(2,k);
           f_sum+=df;
       }
       //去除头部的0.
       QString t_f_sum = QString::number(f_sum).section(".",1,1);
       f_sum = t_f_sum.toDouble();
   }
   QString tem_sum = QString::number(sum);
   if(is_minus)
       tem_sum = "-"+tem_sum;
   if(is_float)
       tem_sum =  tem_sum +"." +QString::number(f_sum);
    tem_sum = delete_zero(tem_sum);
   ui->le_10->setText(tem_sum);
   //转十六进制
   QString t_text = text;
   if(is_minus)
       t_text = "-"+t_text;
   if(is_float)
       t_text = t_text+"."+f_text;
    t_text = delete_zero(t_text);
   ui->le_16->setText(t_text);
}

int Widget::twoToeight(QString str) //2转8
{
    if(str == "000")
        return 0;
    else if(str == "001")
        return 1;
    else if(str == "010")
        return 2;
    else if(str == "011")
        return 3;
    else if(str == "100")
        return 4;
    else if(str == "101")
        return 5;
    else if(str == "110")
        return 6;
    else if(str == "111")
        return 7;
}

int Widget::twoTosixteen(QString str)//2转16
{
    if(str == "0000")
        return 0;
    else if(str == "0001")
        return 1;
    else if(str == "0010")
        return 2;
    else if(str == "0011")
        return 3;
    else if(str == "0100")
        return 4;
    else if(str == "0101")
        return 5;
    else if(str == "0110")
        return 6;
    else if(str == "0111")
        return 7;
    else if(str == "1000")
        return 8;
    else if(str == "1001")
        return 9;
    else if(str == "1010")
        return 10;
    else if(str == "1011")
        return 11;
    else if(str == "1100")
        return 12;
    else if(str == "1101")
        return 13;
    else if(str == "1110")
        return 14;
    else if(str == "1111")
        return 15;
}

QString Widget::eightTotwo(int num)//8转2
{
    switch(num)
    {
        case 0:return "000";
        case 1:return "001";
        case 2:return "010";
        case 3:return "011";
        case 4:return "100";
        case 5:return "101";
        case 6:return "110";
        case 7:return "111";
    default:return 0;
    }
}

QString Widget::sixteenTotwo(int num)//16转2
{
    switch (num)
    {
         case 0:return "0000";
         case 1:return "0001";
         case 2:return "0010";
         case 3:return "0011";
         case 4:return "0100";
         case 5:return "0101";
         case 6:return "0110";
         case 7:return "0111";
         case 8:return "1000";
         case 9:return "1001";
         case 65:return "1010";
         case 66:return "1011";
         case 67:return "1100";
         case 68:return "1101";
         case 69:return "1110";
         case 70:return "1111";
    default:return 0;
    }
}

QString Widget::delete_zero(QString ret)
{
    //无效无用0
    QString str = ret;
    //删除头部无效0
    QString s = str.at(0);
    while(s=="0")
    {
        str.remove(0,1);
        s = str.at(0);
    }
    return str;
}

void Widget::error_tip()
{
    QMessageBox::warning(this,"警告","输入数值格式不正确,不支持转换!");
}


void Widget::on_btn_transition_clicked()//转换
{
    //获取用户输入
    QString texts = ui->le_cin->text();
    int len = texts.length();
    if(texts.at(0)=="-") //判断是否为负数
    {
        is_minus = true;
        texts = texts.remove(0,1);
    }
    else
        is_minus = false;
    if(texts.contains("."))//判断是否带小数
    {
        is_float = true;
    }
    else
        is_float = false;
    switch (system_flag)
    {
    case 2:
    {
        for(int i = 0;i<len;i++)
        {
            QString str = texts.at(i);
            if(str=="0"||str=="1"||str==".")
                continue;
            else
            {
                error_tip();
                return;
            }
        }
        two_transition(texts);
    }
      break;
    case 8:
    {
        for(int i = 0;i<len;i++)
        {
            QString str = texts.at(i);
            if(str=="0"||str=="1"||str=="2"||str=="3"||str=="4"||str=="5"||str=="6"||str=="7"||str==".")
                continue;
            else
            {
                error_tip();
                return;
            }
        }
        eight_transition(texts);
    }
      break;
    case 10:
    {
        for(int i = 0;i<len;i++)
        {
            QString str = texts.at(i);
            if(str=="0"||str=="1"||str=="2"||str=="3"||str=="4"||str=="5"||str=="6"||str=="7"||
                    str=="8"||str=="9"||str==".")
                continue;
            else
            {
                error_tip();
                return;
            }
        }
        ten_transition(texts);
    }
      break;
    case 16:
    {
       if(is_float)
        {
            QString f_text = texts.section(".",-1,-1);
            for(int i = 0;i<f_text.length();i++)
            {
                QString str = f_text.at(i);
                if(str=="0"||str=="1"||str=="2"||str=="3"||str=="4"||str=="5"||str=="6"||str=="7"||
                        str=="8"||str=="9")
                    continue;
                else
                {
                    error_tip();
                    return;
                }
            }
        }

        for(int i = 0;i<len;i++)
        {
            QString str = texts.at(i);
            if(str=="0"||str=="1"||str=="2"||str=="3"||str=="4"||str=="5"||str=="6"||str=="7"||
               str=="8"||str=="9"||str=="."||str=="A"||str=="B"||str=="C"||str=="D"||str=="E"||str=="F"||
               str=="a"||str=="b"||str=="c"||str=="d"||str=="e"||str=="f")
                continue;
            else
            {
                error_tip();
                return;
            }
        }
        sixteen_transition(texts);
    }
      break;
    default:
        return;
}

void Widget::on_radio_2_clicked()
{
    system_flag = 2;
}

void Widget::on_radio_8_clicked()
{
    system_flag = 8;
}

void Widget::on_radio_10_clicked()
{
    system_flag = 10;
}

void Widget::on_radio_16_clicked()
{
    system_flag = 16;
}

 项目源码:https://github.com/17359830697/system_transition

有了这个,再也不怕进制转换了~

这篇文章对你有帮助的话就点个赞吧~

点赞收藏关注就是对我最大的支持~

猜你喜欢

转载自blog.csdn.net/m0_71741835/article/details/127991194