QT의 QString 입력값을 받아 진수 변환을 한 뒤 QString 값으로 출력하고자 한다.

이런 저런 코딩을 하다 보면, 10진수/16진수/2진수 등 진수 변환을 하거나 확인해야 할 경우가 발생한다.
물론 인터넷이 접속된 상태라면 구글링을 통해 진수 변환을 수행하면 되기도 하고, 나와 다르게 코딩 실력자라면 이런 것 쯤은 눈 감고도 하겠지만 ... 본인과 같이 프로그래밍 초짜라면 이런 진수 변환이 난감하다.
다음은 C++/Qt 기반으로 작성되었고, 간단한 진수 변환기를 만들면서 기록하는 내용이다.
들어가기에 앞서 다음의 내용들은 초보적인 입장으로 구글링을 통해 습득(?)한 단순 결과들로 이것이 최선이라고 장담 못함을 미리 언급해 둔다.
QString으로 입력받아 진수를 변환 한다.
물론 INT
등의 형식으로 입력 받아 처리해도 되겠지만, Qt를 사용하다 보면 QString
을 많이 접하게 된다.
대부분의 경우 QString 형식으로 입력 받고, QString 형식으로 출력하게 된다.
10진수 -> 16진수 변환
다음의 함수 및 코드는 이러한 QString 값을 입력 받아 QString으로 결과를 리턴하는 10진수 -> 16진수 변환 코드 이다.
핵심은 QString::arg(...)
를 사용 했다. 이 아규먼트의 자세한 내용은 이 곳 QString::arg(...)을 참조 한다.
QString QString::arg(uint a, int fieldWidth = 0, int base = 10, QChar fillChar = ((QLatin1Char)(' '))) const
| QString ConvertDecHexBin::ConvDecToHex(QString strDec) |
| { |
| |
| |
| QString _retval = ""; |
| bool ok; |
| |
| QString temp = QString("%1").arg(strDec.toUInt(&ok), m_digitNumb, 16, QLatin1Char('0')).toUpper(); |
| |
| if (ok) |
| { |
| _retval = temp; |
| } |
| |
| return _retval; |
| } |
8번째 라인의 참고 사항
.arg(...)
의 결과를 %1
에 반환한다.
strDec.toUInt(&ok)
는 QString 값을 uint 형식으로 변환해 주고 있고, 변환 결과에 따라 bool ok
변수에 true/false를 반환 한다.
m_digitNumb
는 표현하는 최대 자리수를 지정하는 int 형 변수이다. (default = 0)
최대 표현 자리수를 외부에서 컨트롤 하기 위해 멤버 변수로 지정했을 뿐이다.
int base = 16
.. 즉, 16진수로 표현하라~~ 결국 이것이 핵심
QLatin1Char('0')
은 최대 자리수를 표현함에 있어 빈 공간을 무엇으로 채울 것인가..
- 마지막으로
.toUpper()
는 진수를 표현함에 있어 영문자를 대문자로 표현하게 된다. (예: 002A) 이것이 없으면 (002a)와 같이 소문자로 표시
10진수 -> 2진수 변환
다음의 함수 및 코드는 QString 값을 입력 받아 QString으로 결과를 리턴하는 10진수 -> 2진수 변환 코드 이다. 위의 16진수 변환과 거의(!) 동일하고, 8라인의 int base
변수만 2로 바꿨을 뿐...
| QString ConvertDecHexBin::ConvDecToBin(QString strDec) |
| { |
| |
| |
| QString _retval = ""; |
| bool ok; |
| |
| QString temp = QString("%1").arg(strDec.toUInt(&ok), m_digitNumb, 2, QLatin1Char('0')); |
| |
| if (ok) |
| { |
| _retval = temp; |
| } |
| |
| return _retval; |
| } |
2진수 -> 10진수 변환
다음의 함수 및 코드는 QString 값을 입력 받아 QString으로 결과를 리턴하는 2진수 -> 10진수 변환 코드 이다.
10진수로의 변환 핵심은 QString::toUInt(...)
를 사용한 것이고, 자세한 내용은 이 곳 QString::toUInt(...)를 참조 한다.
uint QString::toUInt(bool *ok = Q_NULLPTR, int base = 10) const
| QString ConvertDecHexBin::ConvBinToDec(QString strBin) |
| { |
| |
| |
| QString _retval = ""; |
| bool ok; |
| |
| uint _dec = strBin.toUInt(&ok, 2); |
| if (ok) |
| { |
| _retval = QString::number(_dec); |
| } |
| |
| return _retval; |
| } |
16진수 -> 10진수 변환
다음의 함수 및 코드는 QString 값을 입력 받아 QString으로 결과를 리턴하는 16진수 -> 10진수 변환 코드 이다.
| QString ConvertDecHexBin::ConvHexToDec(QString strHex) |
| { |
| |
| |
| QString _retval = ""; |
| bool ok; |
| |
| |
| uint _dec = strHex.toUInt(&ok, 16); |
| if (ok) |
| { |
| _retval = QString::number(_dec); |
| } |
| |
| return _retval; |
| } |
C++/QT로 만든 진수 변환기
다음은 어설프게 만들어 본 10진수/16진수/2진수 간 변환기이다.

진수변환기 헤더
| #pragma once |
| |
| #include <QtWidgets/QDialog> |
| #include "ui_converterDecHexBin_DLG.h" |
| #include <QString> |
| |
| class ConvertDecHexBin : public QDialog |
| { |
| Q_OBJECT |
| |
| public: |
| ConvertDecHexBin(QWidget *parent = Q_NULLPTR); |
| |
| private: |
| Ui::converterDlg ui; |
| |
| QString ConvDecToHex(QString strDec); |
| QString ConvDecToBin(QString strDec); |
| QString ConvBinToDec(QString strBin); |
| QString ConvHexToDec(QString strHex); |
| int m_digitNumb; |
| void DoClear(); |
| |
| private slots: |
| void on_lineEdit_Dec_returnPressed(); |
| void on_lineEdit_Hex_returnPressed(); |
| void on_lineEdit_Bin_returnPressed(); |
| void on_pushButton_Clear_clicked(); |
| void on_pushButton_Exit_clicked(); |
| void on_spinBox_setDigit_valueChanged(int); |
| }; |
| |
진수변환기 CPP
| #include "ConvertDecHexBin.h" |
| |
| ConvertDecHexBin::ConvertDecHexBin(QWidget *parent) |
| : QDialog(parent) |
| { |
| ui.setupUi(this); |
| |
| m_digitNumb = ui.spinBox_setDigit->value(); |
| } |
| |
| QString ConvertDecHexBin::ConvDecToHex(QString strDec) |
| { |
| |
| |
| QString _retval = ""; |
| bool ok; |
| |
| QString temp = QString("%1").arg(strDec.toUInt(&ok), m_digitNumb, 16, QLatin1Char('0')).toUpper(); |
| |
| if (ok) |
| { |
| _retval = temp; |
| } |
| |
| return _retval; |
| } |
| |
| QString ConvertDecHexBin::ConvDecToBin(QString strDec) |
| { |
| |
| |
| QString _retval = ""; |
| bool ok; |
| |
| QString temp = QString("%1").arg(strDec.toUInt(&ok), m_digitNumb, 2, QLatin1Char('0')); |
| |
| if (ok) |
| { |
| _retval = temp; |
| } |
| |
| return _retval; |
| } |
| |
| QString ConvertDecHexBin::ConvBinToDec(QString strBin) |
| { |
| |
| |
| QString _retval = ""; |
| bool ok; |
| |
| uint _dec = strBin.toUInt(&ok, 2); |
| if (ok) |
| { |
| _retval = QString::number(_dec); |
| } |
| |
| return _retval; |
| } |
| |
| QString ConvertDecHexBin::ConvHexToDec(QString strHex) |
| { |
| |
| |
| QString _retval = ""; |
| bool ok; |
| |
| |
| uint _dec = strHex.toUInt(&ok, 16); |
| if (ok) |
| { |
| _retval = QString::number(_dec); |
| } |
| |
| return _retval; |
| } |
| |
| void ConvertDecHexBin::DoClear() |
| { |
| ui.lineEdit_Dec->setText(""); |
| ui.lineEdit_Hex->setText(""); |
| ui.lineEdit_Bin->setText(""); |
| } |
| |
| void ConvertDecHexBin::on_spinBox_setDigit_valueChanged(int _digit) |
| { |
| m_digitNumb = _digit; |
| |
| if (ui.lineEdit_Dec->text() != "") |
| { |
| ui.lineEdit_Dec->returnPressed(); |
| } |
| } |
| |
| void ConvertDecHexBin::on_lineEdit_Dec_returnPressed() |
| { |
| QString _inVal = ui.lineEdit_Dec->text(); |
| |
| QString strHex = ConvDecToHex(_inVal); |
| QString strBin = ConvDecToBin(_inVal); |
| |
| if (strHex.size() && strBin.size()) |
| { |
| ui.lineEdit_Hex->setText(strHex); |
| ui.lineEdit_Bin->setText(strBin); |
| } |
| else |
| { |
| DoClear(); |
| ui.lineEdit_Dec->setFocus(); |
| } |
| } |
| |
| void ConvertDecHexBin::on_lineEdit_Hex_returnPressed() |
| { |
| QString _inVal = ui.lineEdit_Hex->text(); |
| |
| QString strDec = ConvHexToDec(_inVal); |
| QString strHex = ConvDecToHex(strDec); |
| QString strBin = ConvDecToBin(strDec); |
| |
| ui.lineEdit_Dec->setText(strDec); |
| ui.lineEdit_Hex->setText(strHex); |
| ui.lineEdit_Bin->setText(strBin); |
| } |
| |
| void ConvertDecHexBin::on_lineEdit_Bin_returnPressed() |
| { |
| QString _inVal = ui.lineEdit_Bin->text(); |
| |
| QString strDec = ConvBinToDec(_inVal); |
| QString strHex = ConvDecToHex(strDec); |
| QString strBin = ConvDecToBin(strDec); |
| |
| ui.lineEdit_Dec->setText(strDec); |
| ui.lineEdit_Hex->setText(strHex); |
| ui.lineEdit_Bin->setText(strBin); |
| } |
| |
| void ConvertDecHexBin::on_pushButton_Clear_clicked() |
| { |
| DoClear(); |
| } |
| |
| void ConvertDecHexBin::on_pushButton_Exit_clicked() |
| { |
| this->close(); |
| } |
| |